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

时间:2018-02-28 10:54:21

标签: powershell batch-file environment-variables

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

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

cmd.exe /c ..\..\SET_ENV.bat

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

echo *** Set the environment variables for the processes ***

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

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

2 个答案:

答案 0 :(得分:2)

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

它在cmd中工作,因为批处理文件在同一个进程中执行,因此批处理文件可以设置环境变量,然后它们可用,因为批处理文件不是'在新流程中执行。如果您在交互式cmd /c setenv.cmd会话中使用cmd,则会发现您的环境也未发生变化。

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

答案 1 :(得分:0)

在批处理命令的末尾再次启动PowerShell将使每个环境变量保持至今。

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

PowerShell 开始的以下命令将:

  • 初始化Anaconda
  • 初始化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'

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

中断上面的通话:

  • 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'' "'

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