我在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永远不会被执行!
一些更多的信息和事实:
Start-Process "K:\Path\To\Batch.cmd"也不会提供任何输出,也不会启动批处理脚本 $error[0]为空 Something-Else函数执行得很好(这意味着Start-Some-Batch不会阻止PS脚本完成其执行) 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 。