batファイルからPowerShellへの移行メモ

windows

おつかれさまです。tyamonです。

仕事の自動化で、batファイルを利用してきました。特に copy, del, move や、バックアップで robocopy は頻繁に使います。

最近、PowerShell(.ps1)を使う機会が増えてきたのですが、「あのbatコマンド、PowerShellだとどう書くんだっけ?」と迷うことがよくあります。

今回は、基本的なファイル操作コマンドがPowerShellでどう書けるのかをまとめてみました。

PowerShellの基本的な考え方:「動詞-名詞」

まず、PowerShellの基本的なお作法です。 バッチファイルの copydel のような短いコマンドと違い、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 -Force

4. 高機能コピー (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_FILE

PowerShellスクリプト(.ps1)内でも、robocopy は現役です。

まとめ

バッチファイルの基本操作は、PowerShellでも直感的に(またはそのまま)使えることがわかります。

  • copy, del, move は、Copy-Item, Remove-Item, Move-Item という「動詞-名詞」のコマンドレットに対応。
  • xcopy /Ermdir /S は、-Recurse オプションで代替できる。
  • robocopy は最強なので、PowerShellからもそのまま呼び出して使う。

コメント

タイトルとURLをコピーしました