繁体   English   中英

在更改为cmd后的powershell中,无法通过批处理脚本文件调用bat文件

[英]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"
  • 在调用setupEnv.bat并调用cmd后,它是否会在PowerShell中保留所有环境变量设置?

本文将介绍您的确切方案:

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

这个Foredecker对类似问题的回答中解释

虽然子进程可以从父进程继承当前环境变量,工作目录等,但子进程没有受支持的方式来回到父进程并更改父进程的环境。

解决方案 :从cmd / batch脚本调用Powershell,而不是反之亦然

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM