使用 Powershell 脚本启动的批处理文件设置环境变量

mas*_*saz 4 powershell batch-file environment-variables

我有一个名为 SET_ENV.bat 的批处理脚本,其中包含其他批处理脚本使用的环境变量。目前这个 SET_ENV.bat 由现有的批处理脚本启动。

现在我需要使用 Powershell 脚本,我想启动相同的 SET_ENV.bat。我设法做到这一点:

cmd.exe /c ..\..\SET_ENV.bat
Run Code Online (Sandbox Code Playgroud)

我知道批处理文件已运行,因为它包含一个回声

echo *** Set the environment variables for the processes ***
Run Code Online (Sandbox Code Playgroud)

但是查看环境变量后,我可以看到它们都没有更新。是否有什么阻止我使用 Powershell + 批处理文件组合更新环境变量?

我已经直接从命令行尝试了 SET_ENV.bat 并且它有效。我也尝试过使用“-Verb runAs”的 Start-Process cmdlet,但这没有任何好处。

dta*_*sev 6

在批处理命令结束时再次启动 PowerShell 将保留到目前为止的每个环境变量。

我的用例是:设置 Anaconda 环境,设置 MSVC 环境,然后继续。问题是 Anaconda 和 MSCV 都有一个单独的批处理脚本来初始化 env。

PowerShell开始的以下命令将:

  • 初始化蟒蛇
  • 初始化 MSVC
  • 重新启动 PowerShell
cmd.exe "/K" '%USERPROFILE%\apps\anaconda3\Scripts\activate.bat %USERPROFILE%\apps\anaconda3 && "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat" && powershell'
Run Code Online (Sandbox Code Playgroud)

只需将路径与您需要的内容交换即可。请注意,如果路径包含空格,则需要在双引号内"

分解上面的调用:

  • cmd.exe "/K":cmd命令执行完毕后调用且不退出/K

其余的是完整的命令,它用单引号括起来'

  • %USERPROFILE%\apps\anaconda3\Scripts\activate.bat %USERPROFILE%\apps\anaconda3:activate.bat带参数调用...\anaconda3
  • && "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"&&如果上一个命令没有失败,请运行 MSVC vars 安装文件。这是包裹在里面,"因为它里面有空格。
  • && powershell: 最后运行PowerShell。这现在将包含上述环境变量中的所有环境变量。

只需添加一种更好的方法来进行上述设置:使用 Anaconda 的 PowerShell init 脚本实际让它在提示上显示环境名称。我不会分解它,因为它只是上面修改过的命令。

cmd.exe "/K" '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat" && powershell -noexit -command "& ''~\apps\anaconda3\shell\condabin\conda-hook.ps1'' ; conda activate ''~\apps\anaconda3'' "'
Run Code Online (Sandbox Code Playgroud)

请注意,powershell调用中的单引号全部加倍以转义它们


Joe*_*oey 5

环境变量是进程的本地变量,并且会继承(至少默认情况下)到新的子进程。在您的情况下,您启动 的一个新实例cmd,它继承 PowerShell 的环境变量,但有自己的环境。然后,批处理文件会更改该实例的环境cmd,该实例随后将关闭,您将返回到 PowerShell 脚本。当然,PowerShell 环境中没有任何变化。

它之所以有效,是cmd因为批处理文件是在同一进程中执行的,因此批处理文件可以设置环境变量,并且随后它们可用,因为批处理文件不是在新进程中执行的。如果您cmd /c setenv.cmd在交互式cmd会话中使用,您会发现您的环境也没有改变。

您可以尝试其他选项,例如在与语言无关的文件中指定环境变量,供cmdPowerShell 读取以相应地设置环境。cmd或者,您可以在首次运行批处理文件后启动 PowerShell 脚本。或者您可以在您的用户帐户下设置这些环境变量,以便不再需要关心它们。或者,您只有一份setenv.cmd又一份setenv.ps1,并保持它们同步更新。