外部プログラムの起動

直接指定

 PS> notepad.exe test.txt
  • メモ帳が開く。
  • notepad.exeは環境変数PATHが通っている必要がある。

Invoke-Exporession

 PS> $str = "Get-Process | select -First 1"
 PS> Invoke-Expression $str
 PS> $str = "notepad.exe test.txt"
 PS> Invoke-Expression $str
  • $strがパースされる。
  • いわゆるevalに相当する。

Invoke-Item

 PS> Invoke-Item test.txt
  • (拡張子.txtがメモ帳に関連付けられていれば)メモ帳が起動して、test.txtが開く。

&演算子

 PS> $cmd = "notepad.exe"
 PS> $arg1 = "test.txt"
 PS> & $cmd $arg1
 PS> $cmd = "ping.exe"
 PS> $all_args = @("-n", "3", "www.yahoo.co.jp")
 PS> & $cmd $all_args
 PS> & "C:\Program files\mycommand.exe" "test 2016.txt"
  • 先頭に&を付けて、後に続くコマンドを実行する。
  • &を付けなくても、通常はコマンドが実行できるが、上の3つ目の例のようにコマンドがスペースを持つ場合、引数がスペースを持つ場合、面倒なクォートを考えずに、そのまま実行できず。

参考

http://ss64.com/ps/call.html

外部コマンドプロンプト呼び出し cmd /c

 PS> cmd /c "ping.exe -n 2 www.yahoo.co.jp"
  
 123.1.2.123 からの応答: バイト数 =32 時間 =13ms TTL=57
 123.1.2.123 からの応答: バイト数 =32 時間 =13ms TTL=57
  • cmdに/cオプションをつけて、実行するコマンドを指定する。
  • /cによってコマンドプロンプトを起動して指定されたコマンド実行後にPowerShellに戻る。もし/kオプションにすると、コマンドプロンプトが起動されたままでPowerShellに戻ってこない。

外部コマンドプロンプト呼び出しの結果を変数に格納する

 PS> $result_text = cmd /c dir *.txt
 PS> $result_text
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 4567-1234 です
 
 C:\temp のディレクトリ
 
 2018/08/16  17:32                 3 1.txt
 2018/08/16  17:32                 3 2.txt
 2018/08/16  17:32                 3 3.txt
  • 上の場合、dirはPowerShellのGet-ChildItemではなく、CMD.exeのdirなので、結果の$result_textにはStringが格納される。

CMDでプログラムを実行する場合の戻り値の判定

 & cmd.exe /c 'ping.exe doesnotexist && exit 0 || exit 1'
 Write-Host $?             # => False
 Write-Host $LASTEXITCODE  # => 1
  • CMDで指定するプログラムで適切なエラーコードを返すようにする。
  • そのエラーコードは$?や$LASTEXITCODEで参照できる。

Start-Process

 PS> $ps = Start-Process ping.exe -ArgumentList "-n 10 www.yahoo.co.jp" -PassThru
  • -PassThruパラメータを付けると、$psにプロセスオブジェクトが格納され、$psを通して、外部プロセスの制御が可能になる。

参考

http://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS

Last-modified: 2018-08-19 (日) 00:22:19