Start-Process Cmdlet 调用时批处理脚本未执行

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

但是批处理文件K:\Path\To\Batch.cmd从来没有被执行过!

更多信息和事实:

  • 所有操作均由同一域用户执行
  • PowerShell 版本为 4.0
  • 在 Windows 资源管理器中双击该批处理文件即可顺利执行
  • PowerShell 脚本没有提供任何错误输出
  • 直接从 PowerShell 控制台执行Start-Process "K:\Path\To\Batch.cmd"也不会提供任何输出,也不会启动批处理脚本
  • $error[0]执行后为空
  • 该函数Something-Else执行正常(这意味着Start-Some-Batch不会阻止 PS 脚本完成其执行)
  • 以提升权限运行 PowerShell 脚本不会改变任何事情
  • 从 cmd.exe 提示符调用批处理脚本也无法启动它(无论是否提升权限)
  • Security Settings我怀疑通过组策略传入的数百个

什么原因会导致如此奇怪的行为?我现在已经没有主意了。

答案1

使用 Powershell v4,这对我有用。

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

居住1.cmdc:\test4

答案2

我发现的针对此问题的最佳解决方法来自 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 行的第一次“传递”会将 $batFile 解析为它的正确值,然后将其传递/c 'C:\Path with Spaces\myfile.bat'cmd.exe

相关内容