Windowsバッチファイルで楽をする:FORとIFの組み合わせ

Windows
記事内に広告が含まれています。

Windowsバッチファイルは、そのシンプルさから見過ごされがちですが、FORとIFコマンドを組み合わせることで、その真価を発揮します。
この組み合わせにより、条件に応じた繰り返し処理を行うことができ、複雑なタスクの自動化が可能になります。
ここでは、初心者でも理解しやすいように、具体的な例を交えて、その強力な使い方を解説します。

1. ファイルの日付に基づいた処理

以下のスクリプトは、特定の日付より古いファイルを検出し、それらを処理する方法を示しています。
この例では、2024年4月1日より前のファイルを削除します。

@echo off
for %%i in (*.*) do (
  for /f "tokens=1-3 delims=/" %%a in ("%%~ti") do (
    if "%%a/%%b/%%c" lss "2024/04/01" (
      echo Deleting old file: %%i
      del "%%i"
    )
  )
)

2. テキスト内容に基づくファイルの処理

次のスクリプトは、ファイル内のテキスト内容に基づいて条件分岐を行う方法を示しています。
この例では、’ERROR’という単語を含むファイルを検出し、それらのファイル名をリストします。

@echo off
for %%i in (*.log) do (
  find "ERROR" "%%i" >nul && (
    echo Found error in file: %%i
  )
)

3. ネットワーク接続の確認

以下のスクリプトは、IPアドレスのリストに対してpingを送り、応答のあるものだけを表示する方法を示しています。
これにより、ネットワークの状態を素早く確認できます。

@echo off
for %%i in (192.168.1.1 192.168.1.2 192.168.1.3) do (
  ping -n 1 %%i >nul && (
    echo Response from: %%i
  ) || (
    echo No response from: %%i
  )
)

4. フォルダ内の特定のファイル数をカウント

特定のファイルタイプのファイル数をカウントするスクリプトは、以下のように記述できます。
この例では、’.txt’拡張子を持つファイルの数をカウントします。

@echo off
set /a count=0
for %%i in (*.txt) do (
  set /a count+=1
)
echo Number of .txt files: %count%

5. 複数のファイルから検索

特定の日付のログエントリを複数のファイルから検索し、新しいファイルに書き出すスクリプトは、次のようになります。
この例では、’2024-04-27’の日付のエントリを検索します。

@echo off
for /f "tokens=*" %%i in ('findstr /c:"2024-04-27" *.log') do (
  echo %%i >> results.txt
)

6. 空のディレクトリだけをリストアップ

指定ディレクトリ内のすべてのサブディレクトリをチェックし、空のディレクトリだけをリストアップするスクリプトは、以下の通りです。

@echo off
for /d %%i in (*) do (
  dir "%%i" /b | findstr "^" >nul || (
    echo Empty directory: %%i
  )
)

7. ファイルの拡張子によって処理を変える

ファイルの拡張子に基づいて異なるアクションを実行するスクリプトは、次のように記述できます。
この例では、’.jpg’ファイルは表示し、それ以外のファイルは削除します。

@echo off
for %%i in (*.*) do (
  if "%%~xi"==".jpg" (
    echo Displaying image: %%i
  ) else (
    del "%%i"
  )
)

注意点

バッチファイルを作成する際には、以下の点に注意してください。

  • 変数の拡張: 遅延環境変数展開を使用することで、ループ内で変数の値を更新できます。
  • コマンドの正確な記述: 括弧の位置やスペースの有無が重要です。誤った記述はエラーの原因となります。
  • コマンドのネスト: FORやIFの中でさらにFORやIFを使うときは、ネストが深くなるほど可読性が下がります。
  • コマンドプロンプトの制限: 実行できるコマンドの長さに制限があるため、複雑な一行のコマンドは避けてください。
  • ダブルクォーテーションの使用: パスやコマンドにスペースが含まれている場合は、ダブルクォーテーションを正しく使用してください。
  • パフォーマンスへの影響: スクリプトの実行速度は、書き方によって大きく変わります。効率的なコードを心がけましょう。

遅延環境変数の展開について

ここで遅延環境変数の展開について補足します。
Windowsバッチスクリプトでは、変数は通常、スクリプトが読み込まれた時点で一度だけ展開されます。
これは、スクリプト内で変数の値が変更された場合でも、その変更が反映されないということを意味します。
しかし、遅延環境変数の展開を使用すると、この挙動を変更し、コマンドが実行されるタイミングで変数の値を取得することができます。
これは、ループ処理や条件分岐内で変数の値を動的に更新する必要がある場合に特に有用です。

遅延環境変数の展開を有効にするには、バッチファイルの冒頭で SETLOCAL EnableDelayedExpansion を宣言します。
そして、遅延展開される変数を参照する際には、通常のパーセント記号 (%) ではなく、感嘆符 (!) を使用します。

以下に、遅延環境変数の展開を使用した例を示します。

@echo off
SETLOCAL EnableDelayedExpansion
set /a count=0

for %%i in (*.txt) do (
  set /a count+=1
  echo Number of files processed: !count!
)

ENDLOCAL

この例では、.txt ファイルを検出するたびに count 変数がインクリメントされ、その都度、最新の count 値が表示されます。
遅延環境変数の展開がなければ、ループの最後でのみ count の値が更新され、ループ内での変数の変更は反映されませんでした。

遅延環境変数の展開を使用する際の注意点:

  • SETLOCALENDLOCAL の間でのみ、遅延環境変数の展開が有効です。
  • 感嘆符 (!) を使用するため、スクリプト内で感嘆符を使用する他の用途がある場合は、衝突を避ける必要があります。
  • 遅延環境変数の展開は、コマンドラインやバッチファイルでのみ機能し、WindowsのGUIから実行されるスクリプトでは機能しません。

遅延環境変数の展開は、バッチファイルの柔軟性とパワーを高める重要な機能です。
スクリプトの動的な挙動を必要とする場合には、この機能を活用してください。
適切に使用すれば、より複雑な処理や条件に応じたタスクの自動化が容易になります。
遅延環境変数の展開をマスターすることで、Windowsバッチスクリプトの可能性をさらに広げることができるでしょう。

まとめ

Windowsバッチファイルは、FORとIFの組み合わせによって、その潜在能力を最大限に引き出すことができます。
上記の例を参考に、自分のニーズに合わせたスクリプトを作成してみてください。
バッチファイルは、簡単なタスクから複雑な自動化まで、幅広い用途に使用できる強力なツールです。
正しく使いこなせば、日々の作業を大幅に効率化できるでしょう。

免責規定

OSのバージョンやリリースによっては、実行できない可能性や実行できなくなる可能性のある情報です。
会社内のパソコンなど環境によっては場合にはポリシーや権限により実行できない場合があります。
また実行に管理者の権限が必要な場合があります。
このサイトから得られるすべての情報、コンテンツによって生じるあらゆる問題や結果はすべて自己責任でお願いします。
当サイト管理者は責任の一切を負いません。

最後までお読みいただきありがとうございました。
またお会いしましょう!

コメント

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