@shienaの技術ブログ

Unity

  • System.Diagnostics.Processで外部プロセスを起動してOutputDataReceivedBeginOutputReadLine()などで非同期に出力を読み出す際にWaitForExit(int)trueを返しても出力は完了していない事がある。引数なしのWaitForExit()StandardOutputがEOFになるまで同期するので以下のように書くとよい。
IEnumerator Exec(string command)  
{  
    var psi = new ProcessInfo  
    {  
        CreateNoWindow = true,  
        WindowStyle = ProcessWindowStyle.Hidden,  
        UseShellExecute = false,  
        StandardOutputEncoding = Encoding.UTF8,  
        RedirectStandardOutput = true,  
        File = command  
    };  
    using (var p = new Process())  
    {  
        p.StartInfo = psi;  
        p.OutputDataReceived += (s, o) =>  
        {  
            if (string.IsNullOrEmpty(o.Data)  
            {  
                return;  
            }  
            Debug.Log(o.Data);  
        }  
        p.Start();  
        p.BeginOutputReadLine();  
        do  
        {  
            yield return null;  
        } while (!p.WaitForExit(100));  
        p.WaitForExit(); // StandardOutputがEOFに到達するまで待つ  
        p.CancelOutputRead();  
    }  
}  

Windowsバッチファイル

  • 文字列のエスケープは ^
  • where コマンドでパスを調査できる

このログへのコメント

コメントはありません