web-dev-qa-db-ja.com

Start-Processコマンドレットから呼び出されたときにバッチスクリプトが実行されない

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です
  • エクスプローラ内でダブルクリックしてもバッチファイルは問題なく実行できます
  • PowerShellスクリプトはエラー出力を提供しません
  • 実行中Start-Process "K:\Path\To\Batch.cmd"PowerShellコンソールから直接出力しても何も出力されず、バッチスクリプトも実行されません。
  • $error[0]は実行後に空になります
  • 関数 Something-Elseは問題なく実行されています(つまり、Start-Some-BatchはPSスクリプトの実行の終了を妨げていません)
  • 昇格したPowerShellスクリプトを実行しても、状況は変わりません
  • Cmd.exeプロンプトからバッチスクリプトを呼び出しても起動しない(昇格されているかどうかにかかわらず)
  • 私は100のうちのどれかを疑っていますSecurity Settingsグループポリシー経由

何がそのような奇妙な行動を引き起こす可能性がありますか?ここではアイデアが不足しています。

5
Matze

これが、Powershell v4を使用した場合の動作です。

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

どこ 1.cmd 住む c:\test4

1
maxflipz

この問題について私が見つけた最良の回避策は、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に渡すために機能します。

0
dragon788