当由Start-Process Cmdlet调用时,批处理脚本不会执行

我在Windows Server 2012 R2上遇到了一个奇怪的问题,对我来说根本没有任何意义。

我有一个基本上具有以下结构的PowerShell脚本:

Function Something-Different { [...] } Function Start-Some-Batch { Start-Process "K:\Path\To\Batch.cmd" } Function Something-Else { [...] } Something-Different Start-Some-Batch Something-Else 

batch fileK:\Path\To\Batch.cmd永远不会被执行!

一些更多的信息和事实:

  • 所有操作都使用相同的域用户执行
  • PowerShell版本是4.0
  • 在Windows资源pipe理器中双击该batch file时,可以不出现任何问题
  • PowerShell脚本不提供任何错误输出
  • 直接从PowerShell控制台执行Start-Process "K:\Path\To\Batch.cmd"也不会提供任何输出,也不会启动批处理脚本
  • 执行后$error[0]为空
  • Something-Else函数执行得很好(这意味着Start-Some-Batch不会阻止PS脚本完成其执行)
  • 运行提升的PowerShell脚本不会改变一件事情
  • 从cmd.exe提示调用批处理脚本也不会启动它(提升或不提升)
  • 我怀疑通过组策略的任何一百个Security Settings

什么会导致这样一个奇怪的行为? 我在这里没有想法了。

这是什么对我来说,使用PowerShell v4。

PS C:\Scripts> Start-Process cmd -ArgumentList "/c 1.cmd" -WorkingDirectory c:\test4

1.cmd居住在c:\test4

我发现这个问题的最佳解决方法来自于Chocolatey的Start-ChocolateyProcessAsAdmin方法。

 $somePath = "C:\Path with Spaces" # Like $env:ProgramFiles $batFile= "$someVar\myfile.bat" Start-Process -ArgumentList "/c `'$batFile`'" -FilePath 'cmd.exe' 

请注意,它可以是-ArgumentList单引号或双引号,只要在其他引号内部转义即可。

这是因为PowerShell评估Start-Process行的第一个“pass”会将$ batFileparsing为正确的值,然后将/c 'C:\Path with Spaces\myfile.bat' c'C /c 'C:\Path with Spaces\myfile.bat'传递给cmd.exe