通过将目录更改为工作区目录并调用setupEnv.bat文件,我创建了一个bat文件来设置工作区。但是,当我在PowerShell中执行下面的bat文件时,cmd后的指令没有执行。我需要调用cmd中的setupEnv.bat文件。如果我移除cmd,它就会正常工作。但是我想在cmd上调用setupEnv.bat,而不是在PowerShell中。
D:
cd D:\WorkSpace\
cmd
call setupEnv.bat
echo "Setup Completed"发布于 2017-03-10 23:28:57
本文讨论的是您的确切场景:
Windows IT Pro -负责PowerShell中的环境变量
变量消失的原因是.bat或.cmd在单独的cmd.exe进程中运行(当进程终止时,您会丢失变量)。
本文介绍了一个PowerShell函数,可以用来运行.bat或.cmd脚本,并保留它设置的环境变量:
# Invokes a Cmd.exe shell script and updates the environment.
function Invoke-CmdScript {
param(
[String] $scriptName
)
$cmdLine = """$scriptName"" $args & set"
& $Env:SystemRoot\system32\cmd.exe /c $cmdLine |
Select-String '^([^=]*)=(.*)$' |
ForEach-Object {
$varName = $_.Matches[0].Groups[1].Value
$varValue = $_.Matches[0].Groups[2].Value
Set-Item Env:$varName $varValue
}
}本文还具有在PowerShell中设置和恢复环境变量值的几个功能。
发布于 2017-03-10 07:19:23
在您的PowerShell脚本中尝试这样的内容:
& start "C:\Temp\test.bat"发布于 2017-03-10 23:12:46
调用setupEnv.bat并调用cmd之后,它会在PowerShell中保留所有的环境变量设置吗?
不是的。从PowerShell调用的任何遗留命令都将在单独(子)进程中运行。
证明:
wmic process where "name='powershell.exe' or name='cmd.exe'" get CommandLine, name, ParentProcessId, ProcessId /Value将上面的行添加到批处理文件中,例如到setupEnv.bat,然后从powershell调用它。
D:\bat\setupEnv.bat,& D:\bat\setupEnv.bat,& D:\bat\setupEnv.batcmd为的所有方法。cmd /D /C D:\bat\setupEnv.bat,或& cmd /D /C D:\bat\setupEnv.bat,或. cmd /D /C D:\bat\setupEnv.bat。
结果总是相同的,或至少非常相似:
PS D:\PShell> D:\bat\setupEnv.bat
"Setup Completed"
CommandLine="C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
Name=powershell.exe
ParentProcessId=4280
ProcessId=6396
CommandLine=C:\Windows\system32\cmd.exe /c ""D:\bat\setupEnv.bat""
Name=cmd.exe
ParentProcessId=6396
ProcessId=4116虽然子进程可以从父进程继承当前的环境变量、工作目录等,但是子进程没有支持的方法可以回到父进程并更改父进程的环境。
解决方案:从cmd/batch脚本而不是反之亦然调用Powershell
https://stackoverflow.com/questions/42711294
复制相似问题