PowerShellでプログラムを実行すると、新しいウィンドウが開き、出力が表示される前にウィンドウが閉じます。 PowerShellがこのウィンドウを開いたままにするようにするにはどうすればよいですか?
やってみてください:
start-process your.exe -NoNewWindow
必要に応じて-Wait
も追加します。
OPは答えに満足しているように見えましたが、プログラムの実行後に新しいウィンドウが開いたままになりません。これは、彼が求めているように見えました(そして私が探していた答えです)。それで、もう少し調査した後、私は思いついた:
Start-Process cmd "/c `"your.exe & pause `""
私は数週間前に同様の問題を解決していました。 &(& '.\program.exe'
)を使用したくない場合は、開始プロセスを使用して、開始プロセスごとに出力を読み取ることができます(出力を明示的に読み取る場合)。
これを別のPS1ファイルとして配置するだけです-たとえば(またはマクロに):
param (
$name,
$params
)
$process = New-Object System.Diagnostics.Process
$proInfo = New-Object System.Diagnostics.ProcessStartInfo
$proInfo.CreateNoWindow = $true
$proInfo.RedirectStandardOutput = $true
$proInfo.RedirectStandardError = $true
$proInfo.UseShellExecute = $false
$proInfo.FileName = $name
$proInfo.Arguments = $params
$process.StartInfo = $proInfo
#Register an Action for Error Output Data Received Event
Register-ObjectEvent -InputObject $process -EventName ErrorDataReceived -action {
foreach ($s in $EventArgs.data) { Write-Host $s -ForegroundColor Red }
} | Out-Null
#Register an Action for Standard Output Data Received Event
Register-ObjectEvent -InputObject $process -EventName OutputDataReceived -action {
foreach ($s in $EventArgs.data) { Write-Host $s -ForegroundColor Blue }
} | Out-Null
$process.Start() | Out-Null
$process.BeginOutputReadLine()
$process.BeginErrorReadLine()
$process.WaitForExit()
そしてそれを次のように呼びます:
.\startprocess.ps1 "c:\program.exe" "params"
また、アプリケーションがフリーズする可能性がある場合に備えて、出力を簡単にリダイレクトしたり、何らかのタイムアウトを実装したりすることもできます...
プログラムがcmd /c foo.cmd
コマンドで起動されるバッチファイル(.cmdまたは.bat拡張子)の場合は、単にcmd /k foo.cmd
に変更するとプログラムが実行されますが、プロンプトは開いたままになります。
プログラムがバッチファイルでない場合は、バッチファイルでラップし、最後にpause
コマンドを追加します。プログラムをバッチファイルでラップするには、コマンドをテキストファイルに配置し、拡張子を.cmdにします。次に、exeの代わりにそれを実行します。