リダイレクトされた stdi/o で System.Diagnostics.Process::start() を使用してプロセスを開始しました。このプロセスは別のプロセスを作成します。PowerShell で 2 番目のプロセスの stdi/o をリダイレクトしたいと考えています。
これは、System.Diagnostics.Process::start() を使用して作成された cmd.exe プロセスから perl スクリプトを実行しているサンプル コードです。ログ ファイルで perl スクリプトの出力を確認し、キー ストロークを perl インタープリターに送信したいと考えています。
Powershell スクリプト:
$LogFilePath = ((get-location).ToString() + "\Log.txt");
"test stdio redirection of child process" > $LogFilePath;
$cmdProcess = New-Object System.Diagnostics.Process;
$cmdProcess.StartInfo.FileName = "cmd.exe"
$cmdProcess.StartInfo.UseShellExecute = $false;
$cmdProcess.StartInfo.RedirectStandardInput = $true;
$cmdProcess.StartInfo.RedirectStandardOutput = $true;
$cmdProcess.StartInfo.RedirectStandardError = $true;
Register-ObjectEvent $cmdProcess ErrorDataReceived -SourceIdentifier "cmdProcess.ErrorDataReceived" -Action { if(![string]::IsNullOrEmpty($EventArgs.Data)) { $EventArgs.Data | Add-Content $global:LogFilePath } }
Register-ObjectEvent $cmdProcess OutputDataReceived -SourceIdentifier "cmdProcess.OutputDataReceived" -Action { if(![string]::IsNullOrEmpty($EventArgs.Data)) { $EventArgs.Data | Add-Content $global:LogFilePath } }
$cmdProcess.start()
Start-Sleep -s 2 ;
$cmdProcess.BeginErrorReadLine();
Start-Sleep -s 2 ;
$cmdProcess.BeginOutputReadLine();
Start-Sleep -s 2 ;
$cmdProcess.StandardInput.WriteLine("D:\batch_files\CC_Automation\test\hello.pl") ;
こんにちは。
print "Hello\n";
print "press Enter key to exit";
$key = <>;
出力:Log.txt
子プロセスの stdio リダイレクトのテスト Microsoft Windows [バージョン 6.1.7601] Copyright (c) 2009 Microsoft Corporation. 全著作権所有。C:\Windows\System32\WindowsPowerShell\v1.0>D:\batch_files\CC_Automation\test\hello.pl
「C」で似たようなものを見つけました: https://support.microsoft.com/en-us/kb/190351