Powershellのスクリプトで複数の処理を順番に呼び出したいときや、すでにいくつか用意されている処理をくっつけたいときなんかに、呼び出し元のスクリプトを用意して各処理を呼び出すなんてことができます。
もちろん、処理に引数を渡すこともできます。実際に動作を確認してみたので、やり方を紹介します。
別のスクリプトを呼び出す方法
以下のスクリプトを用意します。動作を確認するために、カッコ内の処理とします。
- 処理1のスクリプト(引数の文字列をテキストファイルに書き出す)
- 処理2のスクリプト(書き出したテキストファイルを読み出す)
- 呼び出し元のスクリプト
ファイル名はそれぞれ以下とします。
- call_ps1_Child_1.ps1
- call_ps1_Child_2.ps1
- call_ps1_Parent.ps1
それぞれのスクリプトの内容です。
1.引数の文字列をテキストファイルに書き出すスクリプト
### 処理1のスクリプト(引数の文字列をテキストファイルに書き出す) $Current = Split-Path $myInvocation.MyCommand.path $input = $args[0] $outFile = "$Current\hoge.txt" Write-Output "引数に $input が入力されました" | out-file $outFile -encoding default |
2.書き出したテキストファイルを読み出すスクリプト
### 処理2のスクリプト(書き出したファイル内容を読み出す) $Current = Split-Path $myInvocation.MyCommand.path $outFile = "$Current\hoge.txt" Get-Content $outFile |
3.それぞれのスクリプトを呼び出すスクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | ### 呼び出し元スクリプト # Script設置フォルダパス $Current = Split-Path $myInvocation.MyCommand.path # 実行プログラムパス $Powershell = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" ### Script呼び出し:テキストファイル書き出し(call_ps1_Child_1.ps1) # 引数指定 $input=$args[0] # 呼び出すスクリプトを指定 $ScriptFile = "$Current\call_ps1_Child_1.ps1 $input" $Argument = "-Command $ScriptFile" # スクリプトを呼び出す Start-Process -FilePath $Powershell -ArgumentList $Argument -NoNewWindow -Wait ### Script呼び出し:テキストファイル読み出し(call_ps1_Child_2.ps1) # 呼び出すスクリプトを指定 $ScriptFile = "$Current\call_ps1_Child_2.ps1" $Argument = "-Command $ScriptFile" # スクリプトを呼び出す Start-Process -FilePath $Powershell -ArgumentList $Argument -NoNewWindow -Wait exit 0 |
ポイントとして、PowerShell のスクリプトを呼び出す場合は、-ArgumentList オプションの引数にスクリプトファイルのパスを指定しますが、その前に「-Command」を付与する必要があります。これは、タスクスケジューラでPowerShellスクリプトを指定するときと同じ指定の仕方です。
わかりやすいように変数をなくして改行を入れて書いてみると以下のようになります。
> Start-Process ` -FilePath "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" ` -ArgumentList "-Command .\call_ps1_Child_1.ps1 hogehogehoge" ` -NoNewWindow ` -Wait 引数に hogehogehoge が付与されました |
外部プログラムを呼び出す
処理1で書き出したテキストファイルをメモ帳で開くという動作ににしてみます。
スクリプトの変更箇所は、以下の2点です。
- 『処理2(テキストファイルを読み出すプログラム)の実行プログラムのパス』に『notepad.exe』を指定
- 『-ArgumentListオプションにわたす引数』に『処理1で書き出したテキストファイルパス』を指定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | ### 呼び出し元スクリプト # Script設置フォルダパス $Current = Split-Path $myInvocation.MyCommand.path ### Script呼び出し:テキストファイル書き出し(call_ps1_Child_1.ps1) $input=$args[0] # 実行プログラムパス $Powershell = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" # 呼び出すスクリプトを指定 $ScriptFile = "$Current\call_ps1_Child_1.ps1 $input" $Argument = "-Command $ScriptFile" Start-Process -FilePath $Powershell -ArgumentList $Argument -NoNewWindow -Wait ### Script呼び出し:テキストファイル読み出し(メモ帳) # 実行プログラムパス $program = "notepad.exe" # 読み出すファイル(実行プログラムにわたす引数) $outFile = "$Current\hoge.txt" $Argument = $outFile Start-Process -FilePath $program -ArgumentList $Argument -NoNewWindow -Wait exit 0 |
まとめ
Powershellスクリプトで、別のPowershellスクリプトを呼び出す方法、外部プログラムを呼び出す方法を紹介しました。
Start-Process を利用すれば引数を付与したり、処理が終わるまで次の処理を待つこともできますし、柔軟なプログラムをかけるのではないでしょうか。
やっぱり便利ですね、PowerShell 。以上です。
↓↓↓ 持っていると便利な一冊 ↓↓↓
2022/2/19 PowerShell
どうも!リョクちゃです。
今回は、PowerShellで外部アプリケーションを呼び出す方法を紹介していきます。
外部アプリケーションは例えば、自身で作成した.exeファイルや、
Pythonのスクリプトも該当しますね。
Windowsコマンドでも呼び出すことはできるのですが、
PowerShellでももちろん、呼び出すことができるので
ここで学んでしまいましょう。
ちなみに前回はこちら
現在の.NetFrameworkを知りたいときってありませんか?いろんな方法でバージョンを確認することはできますが、実はPowerShellでもできるとのことなので今回はPowerShellで確認する方法を紹介していきます。参考になれば嬉しいです。
目次
- 1 PowerShellで外部アプリケーションを呼び出す
- 2 他の呼び出し方
- 3 まとめ
PowerShellで外部アプリケーションを呼び出す
外部アプリケーションを呼び出すには、既にコマンドがサポートされており、
以下のコマンドを使用することで外部アプリケーションを呼び出すことができます。
Start-Process -FilePath <“アプリケーション名”>
Start-Processを使用することで、外部アプリケーションを呼び出すことが可能です。
例) メモ帳を開いてみます。
メモ帳はWindowsでは”notepad“という名称でインストールされています。
Start-Process-FilePath"notepad" |
実行すると、メモ帳が開きます。
例えば、引数を渡したい場合もあると思います。
そんな時は、Start-Processコマンドのオプションに-ArgumentListというのがあります。
このオプションを設定することで外部アプリケーションに引数を渡すことができます。
Start-Process-ArgumentList"引数1","引数2" |
他の呼び出し方
Start-Processで呼び出してもいいんですが、こちらで呼び出すと
外部アプリケーションが終了したときに返される終了コードを受け取ることができません。
そこで終了コードを受け取るには、以下の呼び出し方を検討してみましょう。
System.Diagnostics.ProcessStartInfo
System.Diagnostics.Process
これらを使って、外部アプリケーションを呼び出します。
例) 外部アプリケーションを呼び出す、一連の流れ
$変数名(ProcessStartInfo)=New-ObjectSystem.Diagnostics.ProcessStartInfo $変数名(ProcessStartInfo).FileName="呼び出したい外部アプリケーション名" # 引数を渡したい場合 → $変数名(ProcessStartInfo).Arguments = "引数" $変数名(ProcessStartInfo).UseShellExecute=$false # 外部アプリケーションを起動するときにシェルを使用するか否か $変数名(Process)=New-Object System.Diagnostics.Process $変数名(Process).StartInfo=$変数名(ProcessStartInfoのインスタンスを生成した変数) [void]$変数名(Process).Start() # 外部アプリケーションの実行 $変数名(Process).WaitForExit() # 外部アプリケーションの実行が終了するまで待機 $変数名(終了コードを受け取る)=$変数名(Process).ExitCode # 0以外の受け取り値はNGになります。 |
例) メモ帳を呼び出す流れ
# System.Diagnostics.ProcessStartInfoの設定 $testInfo=New-ObjectSystem.Diagnostics.ProcessStartInfo $testInfo.FileName="notepad" $testInfo.UseShellExecute =$false $System.Diagnostics.Processの設定 $test=New-ObjectSystem.Diagnostics.Process $test.StartInfo=$testInfo [void]$test.Start() $test.WaitForExit() # 終了コードを受け取る $exit=$test.ExitCode $exit |
実行すると、メモ帳が開き、何もせず終了すると
終了コード0が受け取れると思います。
まとめ
PowerShellで外部アプリケーションを呼び出す方法について、紹介していきました。
終了コードを受け取りたい場合には、Start-Processではなく、
System.Diagnostics.ProcessStartInfoと
System.Diagnostics.Processを検討しましょう。
使い方を覚えるとPowerShellだけで外部アプリケーションを呼び出せるようになるので、
便利っちゃ便利です。
また、外部アプリケーションを呼んで処理を任せたいときなんかにも有効ですね。
最後までお読みいただき、ありがとうございます。