Windows環境でのスクリプト例

Windows のバッチファイル.bat)とPowerShell スクリプト.ps1)を使った自動化例を紹介します。ファイル同期やフォルダバックアップ、WinSCP スクリプトの呼び出し、エラーハンドリングなど、実践的なサンプルを通じて学びましょう。


  1. 概要
  2. バッチファイルのサンプル
    • 2.1 フォルダのミラーリング(ROBOCOPY)
    • 2.2 ファイル一括リネーム
    • 2.3 WinSCP スクリプト呼び出し
  3. PowerShell のサンプル
    • 3.1 フォルダバックアップ(Copy-Item)
    • 3.2 環境変数取得とログ出力
    • 3.3 WinSCP コマンドの実行&エラーハンドリング
  4. ポイントと注意事項

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 StopTry/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/CatchERRORLEVEL 判定で障害時の特定を容易に
  • 管理ユーザー:タスクスケジューラ登録時は、該当フォルダへアクセスできる権限のアカウントを指定

以上のサンプルをベースに、自社環境や運用フローに合わせたスクリプトを作成・拡張してください。

▶ 次は 簡単な例と実行手順 のページで、よりステップバイステップな導入手順を確認しましょう。

上部へスクロール