none
start-processの受け渡し

    質問

  • 外部コマンドを終了するまで待ちながら、

    ・実行結果を画面上に標準出力
    ・結果を変数に格納
    ・変数の内容により条件分岐させる

    という事をしたいのですが、

    $a = start-proess -filepath 外部コマンド -argumentlist オプション -PassThru -wait -nonewwindow hidden

    などとしているのですが、実行結果の標準出力の仕方が分からず困っています。
    また、start-processを使用せずに次の処理まで待たせるような書き方というのはあるのでしょうか。





    • 編集済み miles555 2018年6月13日 21:17
    2018年6月13日 20:22

すべての返信

  • PowerShellでは外部コマンドも、コマンドレットと同様にPowerShellのコマンドとして実行することが可能です。外部コマンドの標準出力を文字列として取得することも可能です。

    また、Tee-Objectコマンドレットを用いると、外部コマンドによる標準出力の内容をコンソールに出力すると同時に、文字列として変数に格納することが可能です。

    これらを組み合わせると、以下のようなスクリプトで、外部コマンドの実行結果を表示しつつ、$resultという変数に格納することが可能となります。

    外部コマンド オプション | Tee-Object -Variable result

    Start-Processコマンドレットだと、 -RedirectStandardOutputパラメータを用いて、ファイルに標準出力の内容をリダイレクトすることは可能ですが、標準出力の内容を文字列として変数に格納することはできないように思います。

    2018年6月14日 0:41
    モデレータ
  • .NETのProcessオブジェクトを使うのがいいんじゃないでしょうか。

    $p = New-Object System.Diagnostics.Process
    $p.StartInfo.FileName = $command
    $p.StartInfo.Arguments = $arguments
    $p.StartInfo.UseShellExecute = $false
    $p.StartInfo.CreateNoWindow = $true
    $p.StartInfo.RedirectStandardOutput = $true
    $p.Start()
    $p.WaitForExit()
    $result = $p.StandardOutput.ReadToEnd()
    Write-Host $result

    2018年6月14日 0:43
  • アドバイスありがとうございます。
    私も同様の方法を見つけて試しておりました。
    外部コマンドの戻り値も$p.exitcodeで取ろうとしたのですが、
    別のコードが出てしまっていて原因を調べています。
    2018年6月17日 11:01
  • この場合どのように戻り値を取得すか調べているのですが、中々わからない状態です。

    $LASTEXITCODE変数に格納されます。

    // ついteeが-Variableを取れることを忘れちゃう…。

    2018年6月17日 11:45
  • アドバイスありがとうございます。
    私も試していたのですが、start-processでは文字列格納までは出来ないように感じました。
    tee-objectだと格納と標準出力両々取ってくれますね。
    これと組み合わせて外部コマンド自体が出す戻り値を、条件式に入れ分岐させたいと思っているのですが、
    この場合どのように戻り値を取得すか調べているのですが、中々わからない状態です。
    13 時間 38 分前
  • 質問文が曖昧で適切な回答ができない状況に見受けられます。まず外部プロセスが出力するのは、標準出力(文字列もしくはバイナリ)とExitCode(32bit値)があります。質問者さんはどちらを求めているのか明確に示されていません。

    その上で、標準出力であれば Tee-Object で得られ、ExitCodeであれば $LASTEXITCODE で得られます。

    5 時間 35 分前