मैं Visual Studio कमांड प्रॉम्प्ट के साथ PowerShell का उपयोग कैसे कर सकता हूं?


119

मैं थोड़ी देर के लिए बीटा 2 का उपयोग कर रहा हूं और यह मुझे पागल कर रहा है कि मुझे VS2010 कमांड प्रॉम्प्ट चलाते समय cmd.exe को पंट करना होगा। मैं विजुअल स्टूडियो 2008 के लिए एक अच्छी vsvars2008.ps1 स्क्रिप्ट का इस्तेमाल करता था। किसी के पास भी vsvars2010.ps1 या कुछ इसी तरह का है?

जवाबों:


223

यहां से उदारतापूर्वक चोरी करना: http://allen-mack.blogspot.com/2008/03/replace-visual-studio-command-prompt.html , मुझे यह काम करने में सक्षम था। मैंने अपने प्रोफ़ाइल.प्स 1 में निम्नलिखित को जोड़ा और दुनिया के साथ सब ठीक है।

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

इसने सालों तक अच्छा काम किया है - विजुअल स्टूडियो 2015 तक। vcvarsall.bat अब मौजूद नहीं है। इसके बजाय, आप vsvars32.bat फ़ाइल का उपयोग कर सकते हैं, जो Common7 \ Tools फ़ोल्डर में स्थित है।

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

दृश्य स्टूडियो 2017 के लिए चीजें फिर से बदल गई हैं। vsvars32.batप्रतीत होता है कि इसके पक्ष में गिरा दिया गया है VsDevCmd.bat। आपके द्वारा उपयोग किए जा रहे Visual Studio 2017 के संस्करण के आधार पर सटीक पथ भिन्न हो सकता है।

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
बस एक त्वरित ध्यान दें कि यह एक ही तकनीक विजुअल स्टूडियो 2012 के लिए काम करती है। बस "Microsoft Visual Studio 10.0" को "Microsoft Visual Studio 11.0" में बदलें
एंडी एस

9
echo $Profileअपने profile.ps1 के लिए इच्छित पथ को देखने के लिए, यदि आपने इसे कभी नहीं बनाया है
मैट स्टीफेंसन

5
पटकथा ही अद्भुत काम करती है। हालांकि, (संभवतः) सावधानी का एक नोट: विजुअल स्टूडियो में पैकेज मैनेजर कंसोल अपने आप में एक पॉवरशेल होस्ट है, यह स्क्रिप्ट वहां भी चलेगी। यह तब तक एक समस्या नहीं लगती है जब तक आप ध्यान दें कि "रन विदाउट डीबगिंग" या कोई अन्य फ़ंक्शन या प्लगइन्स चलाते हैं जो कि एक मानक विंडोज कंसोल लॉन्च करते हैं, पीएमसी शुरू होने के बाद काम नहीं करेंगे। मैंने इसके द्वारा "प्रोफाइल.पीएस 1" के उत्तर में स्क्रिप्ट को सहेजने के बजाय इसके चारों ओर काम किया, मैंने इसे "Microsoft.PowerShell_profile.ps1" पर सहेजा ताकि यह केवल "उचित" पावरशेल सत्र में चले।
क्रिस सिमंस

3
पथ को हार्डकोड करने के लिए वास्तव में बुरा अभ्यास है जब उपयोग करने के लिए पूरी तरह से ठीक पर्यावरण चर (VS140COMNTOOLS) VS2015 के लिए हैं। यह भी कस्टम वी.एस. स्थापित के लिए काम करेंगे।
वू

5
मैं पर्यावरण चर का उपयोग करने की इच्छा की सराहना करता हूं, लेकिन उन चर को बहुत बैच फ़ाइल द्वारा आरंभीकृत किया जाता है जिन्हें हम चर से निकालने का प्रयास कर रहे हैं। मुझे इसके विपरीत सबूत देखकर खुशी होगी। जब तक मैं VsDevCmd.bat को निष्पादित नहीं करता, तब तक मेरे पास क्लीन विजुअल स्टूडियो 2017 के साथ एक क्लीन विजुअल स्टूडियो 2017 इंस्टाल और कोई वीएस 150 ईएमएनओटीओएलएस पर्यावरण चर नहीं है।
एंडी एस

26

सबसे सरल विकल्प वीएस 2010 कमांड प्रॉम्प्ट को चलाना है और फिर पावरशेल। Exe शुरू करना है। यदि आप वास्तव में अपने "होम" पॉवरशेल प्रॉम्प्ट से ऐसा करना चाहते हैं, तो आपके द्वारा दिखाया जाने वाला तरीका जाने का रास्ता है। मैं एक स्क्रिप्ट का उपयोग करता हूं जिसे ली होम्स ने कुछ समय पहले लिखा था:

<#
.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
}

नोट: यह फ़ंक्शन जल्द ही आने वाले PowerShell सामुदायिक एक्सटेंशन 2.0 मॉड्यूल-आधारित रिलीज़ में उपलब्ध होगा ।


22

मुझे यहां एक सरल विधि मिली : शॉर्टकट को संशोधित करें।

मूल शॉर्टकट कुछ इस तरह है:

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

& powershellअंतिम उद्धरण से पहले इस तरह जोड़ें :

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

यदि आप इसे पीएस की तरह दिखना चाहते हैं, तो शॉर्टकट गुणों के कलर्स टैब पर जाएं और क्रमशः लाल, हरा और नीला मान 1, 36 और 86 पर सेट करें।

स्क्रीनशॉट


सीधा और आकर्षण की तरह काम करता है। यह उत्तर अधिक उत्थान के योग्य है।
मार्क मयूर

2
केवल एक चीज जो मुझे पसंद नहीं है, वह यह है कि यह एक अनावश्यक cmd.exe प्रक्रिया को लोड रखती है। इसके अलावा एक अच्छा समाधान है।
orad

17

एक पुराना प्रश्न लेकिन (ए) के उत्तर के लिए एक और जवाब देने लायक है; (बी) दो पिछले उत्तरों में से सबसे अच्छा गठबंधन; और (सी) एक समारोह आवरण प्रदान करते हैं।

यह @ एंडी की तकनीक (जो एलन मैक की तकनीक पर निर्माण करता है, जैसा कि एंडी ने संकेत दिया है (जो बदले में रॉबर्ट एंडरसन की तकनीक पर निर्माण करता है, जैसा कि एलन ने संकेत दिया था - जिसमें से सभी को इस पृष्ठ पर संकेत के रूप में थोड़ी गड़बड़ दिखाई दी थी) - ", तो मैंने इसे भी ध्यान में रखा)))।

यहां मेरा अंतिम कोड है - मानों में किसी भी संभावित एम्बेडेड बराबरी को संभालने के लिए regex में गैर-लालची मात्रात्मक के उपयोग पर ध्यान दें। यह कोड को सरल बनाने के लिए भी होता है: एक मैच के बजाय एक एकल मैच फिर एंडी के उदाहरण में विभाजित होता है या फिर एक मैच इंडेक्सोफ और सबस्ट्रिंग जैसा कि "मी -" का उदाहरण है।

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 संगतता के लिए परम अनुभाग की आवश्यकता है [parameter(Mandatory=$true,...
sakra

1
अच्छा है, लेकिन क्या यह पुद / पोप के बिना अच्छा होगा। बस कुछ का उपयोग करें जैसेcmd /c """$targetDir\vcvarsall.bat""&set"
stijn

9

कीथ ने पहले ही अपने Invoke-BatchFileआदेश के साथ PowerShell सामुदायिक एक्सटेंशन (PSCX) का उल्लेख किया है :

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

मैंने यह भी देखा कि PSCX का एक Import-VisualStudioVarsकार्य भी है :

Import-VisualStudioVars -VisualStudioVersion 2013

4
PSCX 3.2.0 के रूप में, वीएस 2015 इस cmdlet में समर्थित नहीं है। मैंने इसके लिए एक मुद्दा खोला ।
orad

3

अपने जवाब के लिए एंडी एस को कुदोस। मैं थोड़ी देर के लिए उनके समाधान का उपयोग कर रहा हूं, लेकिन आज एक समस्या में भाग गया। कोई भी मान जिसमें समान चिह्न है, उसे बराबर चिह्न पर काट दिया जाता है। उदाहरण के लिए, मेरे पास था:

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

लेकिन मेरे PS सत्र की रिपोर्ट:

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

मैंने अपनी प्रोफ़ाइल स्क्रिप्ट को निम्न द्वारा संशोधित किया है:

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

अरे अच्छा जोड़। इसे VS2015 / 17 संस्करणों के साथ भी अपडेट करें ? यह पहला Google परिणाम है, मुझे लगता है कि आपका जोड़ लोगों की मदद करेगा।
स्क्विरेलकिलर

1

किसी के लिए जो अभी भी 2020 और विजुअल स्टूडियो कोड 1.41.1 में इसके साथ संघर्ष कर रहा है, इसलिए यहां विषय से थोड़ा हटकर है।

ऊपर और इंटरनेट के सभी अलग-अलग हिस्सों का उपयोग करना जैसे कि https://help.appveyor.com/discussions/questions/18777-how-to-use-vcvars64bat-from-powershell से और चरण दृष्टिकोण के साथ एक कदम से मैं इसमें कामयाब रहा। नीचे स्क्रिप्ट काम कर रहा है।

VSCode "settings.json" में सहेजा गया और कोड रनर एक्सटेंशन स्थापित किया गया।

Microsoft (R) C / C ++ के साथ विजुअल स्टूडियो 2015 / 14.0 से कम्पाइलर संस्करण "cl.exe" का अनुकूलन:

"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\""}

दृश्य स्टूडियो 2019 / 16.4.3 से Microsoft (R) C / C ++ ऑप्टिमाइज़िंग कंपाइलर संस्करण "cl.exe" के साथ:

"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

मैं इस तरह एक बच्चे के खोल में आदेश पारित करना चाहते हैं:

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

या वैकल्पिक रूप से

cmd /c "`"${env:VS140COMNTOOLS}..\..\VC\vcvarsall.bat`" amd64 && <someCommand> && <someOtherCommand>"  
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.