![](/img/trans.png)
[英]CMD/BATCH BAT SCRIPT How to add digit to file without space
[英]In powershell after changing to cmd unable to call a bat file through a batch script file
我创建了一个bat文件来设置我的工作区,方法是将目录更改为workspace目录并调用setupEnv.bat文件。 但是当我在PowerShell中执行以下bat文件时, cmd之后的指令没有执行。 我需要在cmd中调用setupEnv.bat文件。 如果我删除cmd它将正常工作。 但我想在cmd上调用setupEnv.bat而不是在PowerShell中。
D:
cd D:\WorkSpace\
cmd
call setupEnv.bat
echo "Setup Completed"
本文将介绍您的确切方案:
Windows IT专业版 - 在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中设置和恢复环境变量值的函数。
在PowerShell脚本中尝试类似这样的事情:
& start "C:\Temp\test.bat"
在调用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
, &
call operator & D:\\bat\\setupEnv.bat
, .
dot sourced & D:\\bat\\setupEnv.bat
, cmd
为的所有上述方法
cmd /D /CD:\\bat\\setupEnv.bat
,或 & cmd /D /CD:\\bat\\setupEnv.bat
,或 . cmd /D /CD:\\bat\\setupEnv.bat
. cmd /D /CD:\\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,而不是反之亦然
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.