バッチファイル

バッチファイルでPowerShellコマンドを呼び出してみた

バッチファイルとは、Windows環境で実行できるコマンド列を記述したテキストファイルであるが、バッチファイルから、PowerShellコマンド(コマンドプロンプトの上位互換にあたるもの)を呼び出すこともできる。

今回は、バッチファイル内でPowerShellコマンドを呼び出してみたので、そのサンプルプログラムを共有する。

なお、PowerShellについては、以下のサイト等を参照のこと。
https://and-engineer.com/articles/YTcPjRAAACQAOlud

前提条件

Windowsがインストールされた端末で操作すること。

また、PowerShellのバージョンが以下のようになっていること。
PowerShellバージョン

サンプルプログラムの作成

サンプルプログラムの構成は、以下の通り。
サンプルプログラムの構成

バッチファイルの中身は以下の通りで、バッチファイル内でPowerShellコマンドをそれぞれ呼び出している。

@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行ある。
employee_xml



削除または保存していないWordドキュメントの復元方法【4DDiG Windowsデータ復元】ワード(Word)データ等のファイルを誤って削除してしまった場合は、通常はデータの復元ができませんが、4DDiGというソフトウェアを利用...

サンプルプログラムの実行結果

サンプルプログラムの実行結果は、以下の通り。

1) コマンドプロンプトを起動し、バッチファイルが存在するディレクトリ(C:\tmp)に移動し、各ファイルの存在を確認する。
サンプルプログラムの実行結果_1

2) バッチファイル(call_powershell.bat)を実行する。実行すると、コマンドプロンプトには以下の値が表示される。なお、2023/4/20に実行した結果を表示している。
サンプルプログラムの実行結果_2_1

上記バッチファイル内で実行しているコマンドを、PowerShellで実行した結果は以下の通りで、同じ結果が表示されることが確認できる。なお、2023/4/20に実行した結果を表示している。
サンプルプログラムの実行結果_2_2

サンプルプログラムの実行結果_2_3 サンプルプログラムの実行結果_2_4 サンプルプログラムの実行結果_2_5

ちなみに、「[System.Linq.Enumerable]::Count([System.IO.File]::ReadLines(‘ファイルパス’))」コマンドは、「(Get-Content ‘ファイルパス’).Length」コマンドを高速化したコマンドとなる。

その詳細は、「スクリプト内でサイズの大きなファイルの行数を取得する方法」を参照のこと。

要点まとめ

  • バッチファイルから、PowerShellコマンド(コマンドプロンプトの上位互換にあたるもの)を呼び出すことができる。
  • バッチファイルから、PowerShellコマンドを呼び出す際、引数を渡したり、戻り値を取得したりできる。