おつかれさまです。tyamonです。
仕事の自動化で、batファイルを利用してきました。特に copy, del, move や、バックアップで robocopy は頻繁に使います。
最近、PowerShell(.ps1)を使う機会が増えてきたのですが、「あのbatコマンド、PowerShellだとどう書くんだっけ?」と迷うことがよくあります。
今回は、基本的なファイル操作コマンドがPowerShellでどう書けるのかをまとめてみました。
PowerShellの基本的な考え方:「動詞-名詞」
まず、PowerShellの基本的なお作法です。 バッチファイルの copy や del のような短いコマンドと違い、PowerShellは「コマンドレット (Cmdlet)」と呼ばれる「動詞-名詞」形式のコマンドが基本です。
Copy-Item(アイテムをコピーする)Remove-Item(アイテムを削除する)Move-Item(アイテムを移動する)
また、オプション(スイッチ)も /S /Q のようなスラッシュではなく、 -Recurse -Force のようにハイフン(-)を使います。
1. コピー (copy, xcopy)
バッチファイルでは、ファイル単体なら copy、フォルダごと(サブディレクトリ含む)なら xcopy /E を使うことが多かったと思います。
PowerShellでは Copy-Item に統一されます。
- Batch (
copyファイル):
copy C:\moto\file.txt C:\saki\- Batch (
xcopyフォルダ):
xcopy C:\moto C:\saki /E /I- PowerShell (
Copy-Item):
# ひとつのファイルをコピー
Copy-Item -Path "C:\moto\file.txt" -Destination "C:\saki\"
# フォルダを中身ごとコピー (-Recurse が /E に相当)
Copy-Item -Path "C:\moto" -Destination "C:\saki" -Recurse フォルダをコピーする場合、-Recurse(再帰的)オプションを付けるだけで、xcopy /E と同じように動作してくれます。
2. 移動 (move)
move コマンドは、PowerShellでは Move-Item になります。
- Batch (
move):
move C:\moto\file.txt C:\saki\- PowerShell (
Move-Item):
PowerShellMove-Item -Path "C:\moto\file.txt" -Destination "C:\saki\"
# フォルダごと移動する場合も同
Move-Item -Path "C:\moto_folder" -Destination "C:\saki_folder\"3. 削除 (del, rmdir)
バッチファイルでは、ファイルの削除は del、フォルダ(ディレクトリ)の削除は rmdir (または rd) と分かれていました。
PowerShellでは、どちらも Remove-Item に統一されています。
- Batch (
delファイル):
del C:\temp\file.txt- Batch (
rmdirフォルダ):
rmdir /S /Q C:\temp\old_folder- PowerShell (
Remove-Item):
# ひとつのファイルを削除
Remove-Item -Path "C:\temp\file.txt"
# フォルダを中身ごと削除 (-Recurse が /S、-Force が /Q に相当)
Remove-Item -Path "C:\temp\old_folder" -Recurse -Force4. 高機能コピー (robocopy)
robocopy は、ミラーリング(/MIR)やリトライ(/R:)、ログ出力(/LOG:)などの機能を備えています。
PowerShellでも robocopy.exe をそのまま利用することが可能です。
- Batch (変数を使った例):
@echo off
set MOTO_FOLDER=C:\SourceData
set SAKI_FOLDER=D:\Backups
set LOG_FILE=D:\logs\backup.log
robocopy "%MOTO_FOLDER%" "%SAKI_FOLDER%" /E /R:3 /W:5 /LOG+:%LOG_FILE%- PowerShell (変数を使った例):
# PowerShellでは変数は $ で定義
$MOTO_FOLDER = "C:\SourceData"
$SAKI_FOLDER = "D:\Backups"
$LOG_FILE = "D:\logs\backup.log"
# batファイルと同じオプションがそのまま使える
robocopy $MOTO_FOLDER $SAKI_FOLDER /E /R:3 /W:5 /LOG+:$LOG_FILEPowerShellスクリプト(.ps1)内でも、robocopy は現役です。
まとめ
バッチファイルの基本操作は、PowerShellでも直感的に(またはそのまま)使えることがわかります。
copy,del,moveは、Copy-Item,Remove-Item,Move-Itemという「動詞-名詞」のコマンドレットに対応。xcopy /Eやrmdir /Sは、-Recurseオプションで代替できる。robocopyは最強なので、PowerShellからもそのまま呼び出して使う。

コメント