バッチファイルとは、Windows環境で実行できるコマンド列を記述したテキストファイルであるが、バッチファイルから、PowerShellコマンド(コマンドプロンプトの上位互換にあたるもの)を呼び出すこともできる。
今回は、バッチファイル内でPowerShellコマンドを呼び出してみたので、そのサンプルプログラムを共有する。
なお、PowerShellについては、以下のサイト等を参照のこと。
https://and-engineer.com/articles/YTcPjRAAACQAOlud
前提条件
Windowsがインストールされた端末で操作すること。
また、PowerShellのバージョンが以下のようになっていること。
サンプルプログラムの作成
バッチファイルの中身は以下の通りで、バッチファイル内でPowerShellコマンドをそれぞれ呼び出している。
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 | @echo off REM PowerShellコマンドを利用して、指定した文字列を出力する echo "Write-Host Hello World!!"コマンドの実行結果 powershell "Write-Host Hello World!!" echo. REM PowerShellコマンドを利用して、本日日付(yyyy/mm/dd形式)を取得する echo "Get-Date -UFormat '%%Y/%%m/%%d'"コマンドの実行結果 FOR /F "usebackq delims=" %%A IN (`powershell "Get-Date -UFormat '%%Y/%%m/%%d'"`) DO set thisDay=%%A echo %thisDay% echo. REM 読み込むファイル名を指定 set fileName=employee.xml REM PowerShellコマンドを利用して、指定したファイルの行数を取得する(一般的な方法) echo "(Get-Content 'C:\tmp\%fileName%').Length"コマンドの実行結果 FOR /F "usebackq delims=" %%A IN (`powershell "(Get-Content 'C:\tmp\%fileName%').Length"`) DO set rowCnt=%%A echo %rowCnt% echo. REM PowerShellコマンドを利用して、指定したファイルの行数を取得する(高速化した方法) echo "[System.Linq.Enumerable]::Count([System.IO.File]::ReadLines('C:\tmp\%fileName%'))"コマンドの実行結果 FOR /F "usebackq delims=" %%A IN (`powershell "[System.Linq.Enumerable]::Count([System.IO.File]::ReadLines('C:\tmp\%fileName%'))"`) DO set rowCnt2=%%A echo %rowCnt2% |
また、employee.xmlの内容は以下の通りで、全部で21行ある。
サンプルプログラムの実行結果
サンプルプログラムの実行結果は、以下の通り。
1) コマンドプロンプトを起動し、バッチファイルが存在するディレクトリ(C:\tmp)に移動し、各ファイルの存在を確認する。
2) バッチファイル(call_powershell.bat)を実行する。実行すると、コマンドプロンプトには以下の値が表示される。なお、2023/4/20に実行した結果を表示している。
上記バッチファイル内で実行しているコマンドを、PowerShellで実行した結果は以下の通りで、同じ結果が表示されることが確認できる。なお、2023/4/20に実行した結果を表示している。
ちなみに、「[System.Linq.Enumerable]::Count([System.IO.File]::ReadLines(‘ファイルパス’))」コマンドは、「(Get-Content ‘ファイルパス’).Length」コマンドを高速化したコマンドとなる。
その詳細は、「スクリプト内でサイズの大きなファイルの行数を取得する方法」を参照のこと。
要点まとめ
- バッチファイルから、PowerShellコマンド(コマンドプロンプトの上位互換にあたるもの)を呼び出すことができる。
- バッチファイルから、PowerShellコマンドを呼び出す際、引数を渡したり、戻り値を取得したりできる。