我在 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.cmd
地c:\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
。