У меня здесь странная проблема с 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
никогда не будет казнен!
Еще немного информации и фактов:
Start-Process "K:\Path\To\Batch.cmd"
непосредственно из консоли PowerShell также не предоставляет никаких результатов и не запускает пакетный скрипт$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, разрешит $ batFile до правильного значения, затем он передает /c 'C:\Path with Spaces\myfile.bat'
к cmd.exe
.