PowerShell'i Visual Studio Komut İstemi ile nasıl kullanabilirim?


119

Bir süredir Beta 2 kullanıyorum ve VS2010 Komut İstemi'ni çalıştırırken cmd.exe'ye girmem gerektiği konusunda beni deli ediyor. Visual Studio 2008 için güzel bir vsvars2008.ps1 betiğim vardı. Bir vsvars2010.ps1 veya benzeri bir şeye sahip olan var mı?

Yanıtlar:


223

Buradan özgürce çalarak: http://allen-mack.blogspot.com/2008/03/replace-visual-studio-command-prompt.html , bunu çalıştırmayı başardım. Aşağıdakileri profile.ps1 ekledim ve dünya ile her şey yolunda.

pushd 'c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC'
cmd /c "vcvarsall.bat&set" |
foreach {
  if ($_ -match "=") {
    $v = $_.split("="); set-item -force -path "ENV:\$($v[0])"  -value "$($v[1])"
  }
}
popd
write-host "`nVisual Studio 2010 Command Prompt variables set." -ForegroundColor Yellow

Bu, Visual Studio 2015'e kadar yıllarca iyi çalıştı. Vcvarsall.bat artık mevcut değil. Bunun yerine, Common7 \ Tools klasöründe bulunan vsvars32.bat dosyasını kullanabilirsiniz.

pushd 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools'    
cmd /c "vsvars32.bat&set" |
foreach {
  if ($_ -match "=") {
    $v = $_.split("="); set-item -force -path "ENV:\$($v[0])"  -value "$($v[1])"
  }
}
popd
write-host "`nVisual Studio 2015 Command Prompt variables set." -ForegroundColor Yellow

Visual Studio 2017 için işler yine değişti vsvars32.bat. Lehine bırakılmış gibi görünüyor VsDevCmd.bat. Tam yol, kullandığınız Visual Studio 2017 sürümüne bağlı olarak değişebilir.

pushd "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\Tools"
cmd /c "VsDevCmd.bat&set" |
foreach {
  if ($_ -match "=") {
    $v = $_.split("="); set-item -force -path "ENV:\$($v[0])"  -value "$($v[1])"
  }
}
popd
Write-Host "`nVisual Studio 2017 Command Prompt variables set." -ForegroundColor Yellow

6
Aynı tekniğin Visual Studio 2012 için işe yaradığına dair kısa bir not. "Microsoft Visual Studio 10.0" u "Microsoft Visual Studio 11.0" olarak değiştirin
Andy S

9
echo $Profileprofiliniz için amaçlanan yolu görmek için.ps1, eğer hiç oluşturmadıysanız
Matt Stephenson 21

5
Senaryo kendisi harika çalışıyor. Yine de (muhtemelen) bir uyarı notu: Visual Studio'daki Paket Yöneticisi Konsolu'nun kendisi bir PowerShell ana bilgisayarı olduğundan, bu komut dosyası da orada çalıştırılacaktır. PMC başlatıldıktan sonra standart bir Windows konsolu başlatan "Hata ayıklamadan çalıştır" veya diğer işlevlerin veya eklentilerin çalıştığını fark edene kadar bu bir sorun olarak görünmez. Betiği bu yanıtta "profile.ps1" e kaydetmek yerine, "Microsoft.PowerShell_profile.ps1" e kaydettim, böylece yalnızca "uygun" bir PowerShell oturumunda çalıştırılabilsin.
Chris Simmons

3
Kullanılacak mükemmel derecede iyi ortam değişkenleri (VS140COMNTOOLS için VS2015) varken yolları sabit kodlamak gerçekten kötü bir uygulamadır. Bu, özel VS kurulumları için bile işe yarayacaktır.
Voo

5
Ortam değişkenlerini kullanma arzusunu takdir ediyorum, ancak bu değişkenler, değişkenleri çıkarmaya çalıştığımız toplu iş dosyası tarafından başlatılmış gibi görünüyor. Aksine bir kanıt görmekten mutlu olurum. Temiz bir Visual Studio 2017 yüklemesiyle temiz bir Windows 10 yüklemem var ve VsDevCmd.bat dosyasını çalıştırana kadar VS150COMNTOOLS ortam değişkeni yok.
Andy S

26

En basit seçenek, VS 2010 komut istemini çalıştırmak ve ardından PowerShell.exe'yi başlatmaktır. Bunu gerçekten "evinizdeki" PowerShell komut isteminizden yapmak istiyorsanız, gösterdiğiniz yaklaşım gitmenin yoludur. Lee Holmes'un bir süre önce yazdığı bir senaryoyu kullanıyorum:

<#
.SYNOPSIS
   Invokes the specified batch file and retains any environment variable changes
   it makes.
.DESCRIPTION
   Invoke the specified batch file (and parameters), but also propagate any  
   environment variable changes back to the PowerShell environment that  
   called it.
.PARAMETER Path
   Path to a .bat or .cmd file.
.PARAMETER Parameters
   Parameters to pass to the batch file.
.EXAMPLE
   C:\PS> Invoke-BatchFile "$env:VS90COMNTOOLS\..\..\vc\vcvarsall.bat"       
   Invokes the vcvarsall.bat file to set up a 32-bit dev environment.  All 
   environment variable changes it makes will be propagated to the current 
   PowerShell session.
.EXAMPLE
   C:\PS> Invoke-BatchFile "$env:VS90COMNTOOLS\..\..\vc\vcvarsall.bat" amd64      
   Invokes the vcvarsall.bat file to set up a 64-bit dev environment.  All 
   environment variable changes it makes will be propagated to the current 
   PowerShell session.
.NOTES
   Author: Lee Holmes    
#>
function Invoke-BatchFile
{
   param([string]$Path, [string]$Parameters)  

   $tempFile = [IO.Path]::GetTempFileName()  

   ## Store the output of cmd.exe.  We also ask cmd.exe to output   
   ## the environment table after the batch file completes  
   cmd.exe /c " `"$Path`" $Parameters && set > `"$tempFile`" " 

   ## Go through the environment variables in the temp file.  
   ## For each of them, set the variable in our local environment.  
   Get-Content $tempFile | Foreach-Object {   
       if ($_ -match "^(.*?)=(.*)$")  
       { 
           Set-Content "env:\$($matches[1])" $matches[2]  
       } 
   }  

   Remove-Item $tempFile
}

Not: Bu işlev, yakında çıkacak olan PowerShell Community Extensions 2.0 modül tabanlı sürümünde mevcut olacaktır .


22

Burada basit bir yöntem buldum : kısayolu değiştirin.

Orijinal kısayol şuna benzer:

%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat""

& powershellSon alıntıdan önce şunu ekleyin :

%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat" & powershell"

Daha çok PS'ye benzemek istiyorsanız , kısayol özelliklerinin Renkler sekmesine gidin ve Kırmızı, Yeşil ve Mavi değerlerini sırasıyla 1, 36 ve 86 olarak ayarlayın.

ekran görüntüsü


Anlaşılır ve bir cazibe gibi çalışıyor. Bu cevap daha fazla oyu hak ediyor.
Mark Meuer

2
Bundan hoşlanmadığım tek şey, gereksiz bir cmd.exe işlemini yüklü tutmasıdır. Bunun dışında güzel bir çözüm.
orad

17

Eski bir soru ama başka bir cevaba değer (a) VS2013 desteği sağlama; (b) önceki iki cevabın en iyilerini birleştirmek; ve (c) bir işlev sarmalayıcısı sağlar.

Bu, @ Andy'nin tekniğine dayanıyor (Andy'nin belirttiği gibi Allen Mack'in tekniğine dayanıyor (bu da Allen'ın belirttiği gibi Robert Anderson'ın tekniğine dayanıyor (bunların tümü, bu sayfada kullanıcı tarafından yalnızca "me- - ", bu yüzden bunu da hesaba kattım))).

İşte benim son kodum - değerlerdeki olası gömülü eşitleri işlemek için normal ifadede açgözlü olmayan niceleyicinin kullanımına dikkat edin. Bu aynı zamanda kodu basitleştirmek için de olur: Andy'nin örneğindeki gibi bir eşleşme yerine tek bir eşleşme veya "ben -" örneğindeki gibi indeks ve alt dizeler eşleştirme.

function Set-VsCmd
{
    param(
        [parameter(Mandatory, HelpMessage="Enter VS version as 2010, 2012, or 2013")]
        [ValidateSet(2010,2012,2013)]
        [int]$version
    )
    $VS_VERSION = @{ 2010 = "10.0"; 2012 = "11.0"; 2013 = "12.0" }
    $targetDir = "c:\Program Files (x86)\Microsoft Visual Studio $($VS_VERSION[$version])\VC"
    if (!(Test-Path (Join-Path $targetDir "vcvarsall.bat"))) {
        "Error: Visual Studio $version not installed"
        return
    }
    pushd $targetDir
    cmd /c "vcvarsall.bat&set" |
    foreach {
      if ($_ -match "(.*?)=(.*)") {
        Set-Item -force -path "ENV:\$($matches[1])" -value "$($matches[2])"
      }
    }
    popd
    write-host "`nVisual Studio $version Command Prompt variables set." -ForegroundColor Yellow
}

PowerShell 2.0 uyumluluğu için param bölümü gerektirir [parameter(Mandatory=$true,...
sakra

1
Güzel, ama pushd / popd olmadan daha iyi olurdum. cmd /c """$targetDir\vcvarsall.bat""&set"
Şuna

9

Keith, şu Invoke-BatchFilekomutla PowerShell Community Extensions'tan (PSCX) bahsetti :

Invoke-BatchFile "${env:ProgramFiles(x86)}\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"

Ayrıca PSCX'in bir Import-VisualStudioVarsişlevi olduğunu da fark ettim :

Import-VisualStudioVars -VisualStudioVersion 2013

4
PSCX 3.2.0'dan itibaren, VS 2015 bu cmdlet'te desteklenmemektedir. Bunun için bir konu açtım .
orad

3

Cevabı için Andy S'ye şeref. Çözümünü bir süredir kullanıyorum ama bugün bir sorunla karşılaştım. Eşittir işareti olan herhangi bir değer eşittir işaretinde kesilir. Örneğin:

JAVA_TOOL_OPTIONS=-Duser.home=C:\Users\Me

Ancak PS oturumum şunları bildirdi:

PS C:\> $env:JAVA_TOOL_OPTIONS
-Duser.home

Profil komut dosyamı şu şekilde değiştirerek bunu düzelttim:

pushd 'c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC'
cmd /c "vcvarsall.bat&set" |
foreach {
  if ($_ -match "=") {
    $i = $_.indexof("=")
    $k = $_.substring(0, $i)
    $v = $_.substring($i + 1)
    set-item -force -path "ENV:\$k"  -value "$v"
  }
}
popd

Hey güzel ek. İle güncelleyin VS2015 / 17 sürümleri de? Bu ilk google sonucu, eklemenizin insanlara yardımcı olacağını düşünüyorum.
Sincap

1

2020 ve Visual Studio Code 1.41.1'de hala bununla mücadele eden biri için, bu yüzden burada biraz konu dışı.

Yukarıdan ve İnternet'ten tüm farklı kod parçalarını kullanarak, örneğin https://help.appveyor.com/discussions/questions/18777-how-to-use-vcvars64bat-from-powershell'den ve adım adım bir yaklaşımla aşağıdaki komut dosyasını çalıştırın.

VSCode "settings.json" içine ve Code Runner uzantısı yüklü olarak kaydedildi.

Visual Studio 2015 / 14.0'dan Microsoft (R) C / C ++ Optimizing Compiler Version "cl.exe" ile:

"code-runner.runInTerminal": true,
"code-runner.executorMap": {
  "cpp": "cd $dir; pushd \"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\"; cmd.exe /c \"call vcvarsall.bat x86_amd64 & set > %temp%\\vcvars.txt\"; Get-Content \"$env:temp\\vcvars.txt\" | Foreach-Object { if ($_ -match \"^(.*?)=(.*)$\") {   Set-Content \"env:\\$($matches[1])\" $matches[2]  }}; popd; cls; cl *.cpp; .\\\"$fileNameWithoutExt.exe\"; Write-Host -NoNewLine 'Press any key to continue...';  $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); del \"$fileNameWithoutExt.exe\"; del \"$fileNameWithoutExt.obj\""}

Visual Studio 2019 / 16.4.3'ten Microsoft (R) C / C ++ Optimize Edici Derleyici Sürümü "cl.exe" ile:

"code-runner.runInTerminal": true,
"code-runner.executorMap": {
  "cpp": "cd $dir; pushd \"c:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Auxiliary\\Build\"; cmd.exe /c \"call vcvarsall.bat x86_amd64 & set > %temp%\\vcvars.txt\"; Get-Content \"$env:temp\\vcvars.txt\" | Foreach-Object { if ($_ -match \"^(.*?)=(.*)$\") {   Set-Content \"env:\\$($matches[1])\" $matches[2]  }}; popd; cls; cl *.cpp; .\\\"$fileNameWithoutExt.exe\"; Write-Host -NoNewLine 'Press any key to continue...';  $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); del \"$fileNameWithoutExt.exe\"; del \"$fileNameWithoutExt.obj\""}

HTH


0

Komutları bir alt kabuğa şu şekilde iletmeyi seviyorum:

cmd /c "`"${env:VS140COMNTOOLS}vsvars32.bat`" && <someCommand>"

Veya alternatif olarak

cmd /c "`"${env:VS140COMNTOOLS}..\..\VC\vcvarsall.bat`" amd64 && <someCommand> && <someOtherCommand>"  
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.