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,但这没有任何好处。
在批处理命令结束时再次启动 PowerShell 将保留到目前为止的每个环境变量。
我的用例是:设置 Anaconda 环境,设置 MSVC 环境,然后继续。问题是 Anaconda 和 MSCV 都有一个单独的批处理脚本来初始化 env。
从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
调用中的单引号全部加倍以转义它们
环境变量是进程的本地变量,并且会继承(至少默认情况下)到新的子进程。在您的情况下,您启动 的一个新实例cmd
,它继承 PowerShell 的环境变量,但有自己的环境。然后,批处理文件会更改该实例的环境cmd
,该实例随后将关闭,您将返回到 PowerShell 脚本。当然,PowerShell 环境中没有任何变化。
它之所以有效,是cmd
因为批处理文件是在同一进程中执行的,因此批处理文件可以设置环境变量,并且随后它们可用,因为批处理文件不是在新进程中执行的。如果您cmd /c setenv.cmd
在交互式cmd
会话中使用,您会发现您的环境也没有改变。
您可以尝试其他选项,例如在与语言无关的文件中指定环境变量,供cmd
PowerShell 读取以相应地设置环境。cmd
或者,您可以在首次运行批处理文件后启动 PowerShell 脚本。或者您可以在您的用户帐户下设置这些环境变量,以便不再需要关心它们。或者,您只有一份setenv.cmd
又一份setenv.ps1
,并保持它们同步更新。
归档时间: |
|
查看次数: |
5259 次 |
最近记录: |