Windows のバッチファイル(.bat
)とPowerShell スクリプト(.ps1
)を使った自動化例を紹介します。ファイル同期やフォルダバックアップ、WinSCP スクリプトの呼び出し、エラーハンドリングなど、実践的なサンプルを通じて学びましょう。
- 概要
- バッチファイルのサンプル
- 2.1 フォルダのミラーリング(ROBOCOPY)
- 2.2 ファイル一括リネーム
- 2.3 WinSCP スクリプト呼び出し
- PowerShell のサンプル
- 3.1 フォルダバックアップ(Copy-Item)
- 3.2 環境変数取得とログ出力
- 3.3 WinSCP コマンドの実行&エラーハンドリング
- ポイントと注意事項
1. 概要
- バッチファイル はコマンドプロンプト上でそのまま動作し、古い環境でも互換性が高い。
- PowerShell はモダンなシェルで、オブジェクト指向のパイプラインや高度なエラー処理が可能。
- 共用サーバー運用では、これらでローカル前処理や WinSCP スクリプトの起動をまとめ、自動化を図ります。
2. バッチファイルのサンプル
2.1 フォルダのミラーリング(ROBOCOPY)
bat
@echo off
REM ─────────────
REM ミラーリング例:ローカル→バックアップフォルダ
REM ─────────────
set SOURCE=C:\Projects\MySite
set DEST=D:\Backup\MySite
set LOGFILE=D:\Logs\backup_%date:~0,4%%date:~5,2%%date:~8,2%.log
REM /MIR : ミラーリング (差分のみコピー+削除)
REM /Z : 再開可能モード
REM /NP : 進捗パーセント非表示
REM /R:3 /W:5 : リトライ回数/待機秒
robocopy "%SOURCE%" "%DEST%" /MIR /Z /NP /R:3 /W:5 > "%LOGFILE%" 2>&1
if %ERRORLEVEL% GEQ 8 (
echo [%date% %time%] バックアップに失敗しました。エラーコード=%ERRORLEVEL% >> "%LOGFILE%"
) else (
echo [%date% %time%] バックアップ完了 >> "%LOGFILE%"
)
- ROBOCOPY を使った高速差分同期
ERRORLEVEL
を使って成否をログに出力
2.2 ファイル一括リネーム
bat
@echo off
REM ─────────────
REM ファイル名先頭に日付付与
REM ─────────────
setlocal enabledelayedexpansion
set FOLDER=C:\Data\Reports
for %%F in ("%FOLDER%\*.txt") do (
set FILE=%%~nxF
for /f "tokens=1-3 delims=/" %%a in ('date /t') do set D=%%c%%a%%b
ren "%%F" "!D!_!FILE!"
)
for %%F
で対象ファイルをループdate /t
から日付文字列取得 → ファイル名に付加
2.3 WinSCP スクリプト呼び出し
bat
@echo off
REM ─────────────
REM WinSCP スクリプト実行例
REM ─────────────
set WINSCP="C:\Program Files (x86)\WinSCP\WinSCP.com"
set SCRIPT="C:\scripts\sync.txt"
set LOG="C:\scripts\winscp_%date:~0,4%%date:~5,2%%date:~8,2%.log"
%WINSCP% /script=%SCRIPT% /log=%LOG%
if ERRORLEVEL 1 (
echo [%date% %time%] WinSCP 実行エラー >> "%LOG%"
) else (
echo [%date% %time%] WinSCP 実行完了 >> "%LOG%"
)
/script
と/log
オプションERRORLEVEL
でスクリプト成功・失敗を判定
3. PowerShell のサンプル
3.1 フォルダバックアップ(Copy-Item)
powershell
# ─────────────
# フォルダを丸ごとバックアップ
# ─────────────
$source = "C:\Projects\MySite"
$dest = "D:\Backup\MySite"
$log = "D:\Logs\PSBackup_$(Get-Date -Format 'yyyyMMdd').log"
Try {
Copy-Item -Path $source -Destination $dest -Recurse -Force -ErrorAction Stop
"`n$(Get-Date) Backup succeeded" | Out-File $log -Append
}
Catch {
"`n$(Get-Date) Backup failed: $_" | Out-File $log -Append
}
-ErrorAction Stop
とTry/Catch
で確実なエラーハンドリング- オブジェクトとして日時取得・文字列化
3.2 環境変数取得とログ出力
powershell
# ─────────────
# 環境情報をログに書き出し
# ─────────────
$envUser = $env:USERNAME
$envPath = $env:PATH
$log = "C:\Logs\Env_$(Get-Date -Format 'yyyyMMdd_HHmmss').txt"
"User: $envUser" | Out-File $log
"Path: $envPath" | Out-File $log -Append
$env:VAR_NAME
で環境変数にアクセスOut-File -Append
で追記
3.3 WinSCP コマンド実行&エラーハンドリング
powershell
# ─────────────
# PowerShell から WinSCP スクリプトを呼び出す
# ─────────────
$winscp = "C:\Program Files (x86)\WinSCP\WinSCP.com"
$script = "C:\scripts\sync.txt"
$log = "C:\scripts\winscp_$(Get-Date -Format 'yyyyMMdd').log"
$proc = Start-Process -FilePath $winscp `
-ArgumentList "/script=$script", "/log=$log" `
-NoNewWindow -Wait -PassThru
if ($proc.ExitCode -ne 0) {
"[$(Get-Date)] WinSCP failed with code $($proc.ExitCode)" | Out-File $log -Append
} else {
"[$(Get-Date)] WinSCP succeeded" | Out-File $log -Append
}
Start-Process -Wait -PassThru
で終了コードを取得$proc.ExitCode
で成否判定
4. ポイントと注意事項
- 文字コード:バッチは ANSI/Shift-JIS、PowerShell は UTF-8(BOMなし) に統一
- 実行権限:PowerShell は実行ポリシー(
Get-ExecutionPolicy
)を要確認 - パスにスペース:引用符
"C:\Program Files\..."
を忘れずに - ログ管理:日付付きファイル名と
Try/Catch
やERRORLEVEL
判定で障害時の特定を容易に - 管理ユーザー:タスクスケジューラ登録時は、該当フォルダへアクセスできる権限のアカウントを指定
以上のサンプルをベースに、自社環境や運用フローに合わせたスクリプトを作成・拡張してください。
▶ 次は 簡単な例と実行手順 のページで、よりステップバイステップな導入手順を確認しましょう。