Powershellのスクリプトで複数の処理を順番に呼び出したいときや、すでにいくつか用意されている処理をくっつけたいときなんかに、呼び出し元のスクリプトを用意して各処理を呼び出すなんてことができます。
もちろん、処理に引数を渡すこともできます。実際に動作を確認してみたので、やり方を紹介します。
別のスクリプトを呼び出す方法
以下のスクリプトを用意します。動作を確認するために、カッコ内の処理とします。
- 処理1のスクリプト(引数の文字列をテキストファイルに書き出す)
- 処理2のスクリプト(書き出したテキストファイルを読み出す)
- 呼び出し元のスクリプト
ファイル名はそれぞれ以下とします。
- call_ps1_Child_1.ps1
- call_ps1_Child_2.ps1
- call_ps1_Parent.ps1
それぞれのスクリプトの内容です。
1.引数の文字列をテキストファイルに書き出すスクリプト
1 2 3 4 5 6 7 |
### 処理1のスクリプト(引数の文字列をテキストファイルに書き出す) $Current = Split-Path $myInvocation.MyCommand.path $input = $args[0] $outFile = "$Current\hoge.txt" Write-Output "引数に $input が入力されました" | out-file $outFile -encoding default |
2.書き出したテキストファイルを読み出すスクリプト
1 2 3 4 5 6 |
### 処理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スクリプトを指定するときと同じ指定の仕方です。
わかりやすいように変数をなくして改行を入れて書いてみると以下のようになります。
1 2 3 4 5 6 7 |
> 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 。以上です。
↓↓↓ 持っていると便利な一冊 ↓↓↓