首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在powershell中,更改为cmd后,无法通过批处理脚本文件调用bat文件。

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

Stack Overflow用户
提问于 2017-03-10 05:58:48
回答 3查看 677关注 0票数 1

通过将目录更改为工作区目录并调用setupEnv.bat文件,我创建了一个bat文件来设置工作区。但是,当我在PowerShell中执行下面的bat文件时,cmd后的指令没有执行。我需要调用cmd中的setupEnv.bat文件。如果我移除cmd,它就会正常工作。但是我想在cmd上调用setupEnv.bat,而不是在PowerShell中。

代码语言:javascript
运行
复制
D:
cd D:\WorkSpace\
cmd
call setupEnv.bat
echo "Setup Completed"
  • 在调用setupEnv.bat和调用cmd之后,它会在PowerShell中保留所有的环境变量设置吗?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-10 23:28:57

本文讨论的是您的确切场景:

Windows IT Pro -负责PowerShell中的环境变量

变量消失的原因是.bat.cmd在单独的cmd.exe进程中运行(当进程终止时,您会丢失变量)。

本文介绍了一个PowerShell函数,可以用来运行.bat.cmd脚本,并保留它设置的环境变量:

代码语言:javascript
运行
复制
# 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中设置和恢复环境变量值的几个功能。

票数 3
EN

Stack Overflow用户

发布于 2017-03-10 07:19:23

在您的PowerShell脚本中尝试这样的内容:

代码语言:javascript
运行
复制
& start "C:\Temp\test.bat"
票数 0
EN

Stack Overflow用户

发布于 2017-03-10 23:12:46

调用setupEnv.bat并调用cmd之后,它会在PowerShell中保留所有的环境变量设置吗?

不是的。从PowerShell调用的任何遗留命令都将在单独(子)进程中运行。

证明

代码语言:javascript
运行
复制
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.bat
  • 或修改上述调用cmd为的所有方法。
    • cmd /D /C D:\bat\setupEnv.bat,或
    • & cmd /D /C D:\bat\setupEnv.bat,或
    • . cmd /D /C D:\bat\setupEnv.bat

结果总是相同的,或至少非常相似:

代码语言:javascript
运行
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42711294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档