2010-01-23 45 views

Trả lời

169

Ăn cắp tự do tại đây: http://allen-mack.blogspot.com/2008/03/replace-visual-studio-command-prompt.html, tôi có thể làm việc này. Tôi đã thêm thông tin sau vào tiểu sử của mình.ps1 và tất cả đều tốt đẹp với thế giới.

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 

Điều này đã hoạt động tốt trong nhiều năm - cho đến Visual Studio 2015. vcvarsall.bat không còn tồn tại nữa. Thay vào đó, bạn có thể sử dụng tệp vsvars32.bat, nằm trong thư mục 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 

Mọi thứ đã thay đổi một lần nữa cho Visual Studio 2017. vsvars32.bat dường như đã bị bỏ ủng hộ VsDevCmd.bat. Đường dẫn chính xác có thể khác nhau tùy thuộc vào phiên bản Visual Studio 2017 bạn đang sử dụng.

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 
+0

tôi đã làm như vậy và điều này chỉ làm việc tốt. –

+0

Tôi đồng ý - điều này cũng làm việc hoàn hảo cho tôi. Tôi cũng đã phải thay đổi đường dẫn đến studio trực quan trong Program Files (không phải x86), vì tôi không sử dụng hệ thống 64 bit. – czuroski

+6

Chỉ cần lưu ý nhanh rằng kỹ thuật tương tự này hoạt động cho Visual Studio 2012. Chỉ cần thay đổi "Microsoft Visual Studio 10.0" thành "Microsoft Visual Studio 11.0" –

24

Tùy chọn đơn giản nhất là chạy lời nhắc lệnh VS 2010 và sau đó khởi động PowerShell.exe. Nếu bạn thực sự muốn thực hiện điều này từ lời nhắc PowerShell "home" của mình, cách tiếp cận bạn hiển thị là cách để thực hiện. Tôi sử dụng một kịch bản mà Lee Holmes đã viết một khi trở lại:

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

Lưu ý: chức năng này sẽ có sẵn trong các PowerShell Community Extensions 2.0 phát hành mô-đun dựa trên sẽ sớm ra mắt.

2

Kudos gửi Andy S cho câu trả lời của anh ấy. Tôi đã sử dụng giải pháp của anh ấy một thời gian, nhưng đã gặp phải vấn đề ngày hôm nay. Bất kỳ giá trị nào có dấu bằng trong nó được cắt ngắn tại dấu bằng. Ví dụ, tôi đã có:

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

Nhưng phiên PS của tôi báo cáo:

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

tôi cố định này bằng cách sửa đổi kịch bản hồ sơ của tôi như sau:

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 
16

Một câu hỏi cũ nhưng giá trị một câu trả lời khác cho (a) cung cấp cho VS2013 suppport; (b) kết hợp tốt nhất hai câu trả lời trước đó; và (c) cung cấp một hàm bao hàm.

Điều này xây dựng trên kỹ thuật của Andy Andy (được xây dựng dựa trên kỹ thuật của Allen Mack như Andy đã chỉ ra (theo đó nó được xây dựng dựa trên kỹ thuật của Robert Anderson như Allen đã chỉ ra). là "tôi--", vì vậy tôi cũng tính đến điều đó))).

Đây là mã cuối cùng của tôi - lưu ý việc sử dụng định lượng không tham lam trong regex để xử lý mọi giá trị nhúng có thể có trong các giá trị. Điều đó cũng xảy ra để đơn giản hóa mã: một kết hợp duy nhất thay vì một kết quả trùng khớp sau đó được chia nhỏ như trong ví dụ của Andy hoặc một đối sánh sau đó chỉ mục và các phần tử như trong ví dụ "của tôi").

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 
} 
+0

Dành cho PowerShell 2.0 tương thích với phần param yêu cầu '[tham số (Bắt buộc = $ true,' ... – sakra

+1

Đẹp, nhưng sẽ tốt hơn nếu không có pushd/popd. Chỉ cần sử dụng một cái gì đó như 'cmd/c" "" $ targetDir \ vcvarsall.bat "" & thiết lập "' – stijn

9

Tôi đã tìm thấy một phương pháp đơn giản here: sửa đổi phím tắt.

Phím tắt ban đầu là một cái gì đó như thế này:

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

Thêm & powershell trước khi báo cuối cùng, như thế này:

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

Nếu bạn muốn làm cho nó trông giống như PS, đi đến Màu tab của thuộc tính phím tắt và đặt các giá trị Red, Green và Blue thành 1, 36 và 86 tương ứng.

screenshot

+0

Đơn giản và hoạt động như một sự quyến rũ. Câu trả lời này xứng đáng có nhiều upvotes. –

+1

Điều duy nhất tôi không thích về điều này, là nó giữ một quá trình cmd.exe thừa nạp. Khác hơn là một giải pháp tốt đẹp – orad

5

Keith đã đề cập PowerShell Extensions Cộng đồng (PSCX), với Invoke-BatchFile lệnh của nó:

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

Tôi cũng nhận thấy rằng PSCX cũng có một Import-VisualStudioVars chức năng:

Import-VisualStudioVars -VisualStudioVersion 2013 
+4

Theo PSCX 3.2.0, VS 2015 không được hỗ trợ trong lệnh này, tôi đã mở [issue] (https://pscx.codeplex.com/workitem/43203) cho nó. – orad

0

Tôi muốn vượt qua các lệnh vào một vỏ con như vậy:

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

Hoặc cách khác

cmd /c "`"${env:VS140COMNTOOLS}..\..\VC\vcvarsall.bat`" amd64 && <someCommand> && <someOtherCommand>" 
Các vấn đề liên quan