PC-More

パソコンの基本操作や使い方、便利化、カスタマイズ方法、フリーソフト等の紹介。

バッチファイルで処理を自動化する

バッチファイルとは、行う処理を書いた、単純なテキストファイルです。

例えば、以下のような事が出来ます。

  • ファイルやフォルダを、作成削除名前の変更をする
  • ソフトをまとめて起動、又は、順次起動する
  • 他のプログラムと組み合わせて動画、画像、音声などを編集する

簡単なバッチファイルを作る

まずは、簡単なバッチファイルを作ってみましょう。

作成

メモ帳等のテキストエディタを起動し、以下のサンプルをコピー&ペーストするか、手打ちしてください。

手打ちする場合は、基本的に構文に使うアルファベットや記号は半角で記述してください。

@echo off

rem ■ メモ帳を起動する
start "" "C:\Windows\notepad.exe"

rem ■ 2秒待つ
ping localhost -n 3 >NUL:

rem ■ 電卓を起動する
start "" "C:\Windows\System32\calc.exe"

rem ■ 完了メッセージを表示する
echo.処理を完了しました。

pause

解説

@echo off」は表示をシンプルにする為のものです。

rem 」から始まる行は、コメント行で意味を持ちません。説明等を記述します。

pause」は、処理を一時停止させるものです。

その他の処理は、コメントに書かれている通りです。

保存

メモ帳の場合は、
上部メニューの「ファイル」をクリックし、
名前を付けて保存」をクリックし、
文字コード」又は「エンコード」の欄をクリックして、「ANSI」をクリックし、
左の欄で保存場所を選択し、
末尾が「.bat」(半角)の任意の名前(「テスト.bat」等)を付け、
Enterキーを押すか、「保存」をクリックします。

実行

保存した場所を開き、保存したバッチファイルをダブルクリックして実行します。

黒いウィンドウが表示され、コメント通りの処理が実行されれば成功です。

Enterキーを押すか、ウィンドウを閉じると終了します。

編集

保存したバッチファイルを編集するには、そのバッチファイルを右クリックし、(「その他のオプションを表示」があればそれをクリックし、)「編集」をクリックします。

バッチファイルの基本

バッチファイルを作成する上での基本についてです。

構文

バッチファイルの記述についてです。

行の最初には、「コマンド」か「実行したいもの」を記述します。

続けて、半角スペースで区切り、「引数」(パラメータ)や「オプション」と呼ばれるものを書き込みます。

コマンド」とは、命令のようなものです。

引数やオプション」とは、その設定のようなものです。

以下のようなイメージです。

コマンド 第1引数 第2引数 第3引数 ・・・
 ↓
命令 設定1 設定2 設定3 ・・・

例えば、フォルダを作成する「md」というコマンドがあります。

md "新しいフォルダ"」という記述の場合、以下のような意味になります。

md "新しいフォルダ"
 ↓
フォルダを作れ 「新しいフォルダ」という名前の

又、バッチファイルにおいて、一部の半角記号全角スペースは特殊な意味を持ちますので、それらを使う場合は、「"」で前後を囲みます。そうすると意味はなくなり、ただの文字として認識されます。

以下は、「AAA BBB」という名前のフォルダを作成する例です。半角スペースが含まれています。

半角スペースで区切られてしまわないように、「"」で囲んでいます。

md "AAA BBB"

区切りとして認識される文字」は、「半角スペース」「全角スペース」と、半角の「 ; , = 」です。

特殊な意味を持つ文字」は、半角の「 " < > % & | ^ 」等です。

ただ、「%」は特別で、「"」で囲んでも特殊な意味を持ち続けます。

対処法として、ファイル名やフォルダ名に「%」を使いたい場合は、「%%」と記述します。これで1個の「%」を表します。

つまり、「100%」という名前のフォルダを作成したい場合は、「md "100%%"」と記述します。

又、「"」で囲んでいない状態で「特殊な意味を持つ文字」の意味をなくすには、その文字の直前に「^」を記述します。

つまり、「AAA&BBB」という名前のフォルダを作成したい場合は、「md AAA^&BBB」と記述します。

ただし、先述の通り、「%」だけは、「^」を使うのではなく、「%%」と記述します。

基本的に、半角記号を文字として使う場合は、「"」で囲んでおくと良いかと思います。

コマンドプロンプト

バッチファイルは、「コマンドプロンプト」と呼ばれるプログラム上で実行されます。

バッチファイルを実行すると、そのバッチファイルがコマンドプロンプトで実行されますが、コマンドプロンプトを単体で実行したい場合は、スタートメニューの中の、「Windows システム ツール」や「アクセサリ」の中の、「コマンドプロンプト」を実行します。

又、Windowsロゴのキーを押しながら「R」キーを押し、出た小窓に「cmd」と打ち込んで、Enterキーを押しても起動出来ます。

コマンドプロンプトは、真っ黒なウィンドウで、左には現在作業しているフォルダ(カレントディレクトリ)が表示されています。このフォルダを起点に作業します。
画像

末尾の「>」は、ユーザーからの入力待ちである事表しています。

例えば、「dir」と打ち込んでEnterキーを押すと、カレントディレクトリの情報が表示されます。

カレントディレクトリとは

バッチファイルやプログラムには、「カレントディレクトリ」という概念が存在します。

これは、人間が物理的なフォルダを開いているのと同じで、「現在開いて作業しているフォルダ(場所)」という意味です。

バッチファイルを普通に起動した場合は、バッチファイルがあるフォルダがカレントディレクトリとなります。

バッチファイルに対し、何かのファイルやフォルダをドラッグ&ドロップした場合(ファイル等をバッチファイルのアイコン上にクリックしたまま持ってきて放した場合)は、カレントディレクトリがバッチファイルのある場所ではなくなるので、注意が必要です。

半角記号の意味

バッチファイルにおける半角記号の意味です。

<」=この文字の、右側に書いたファイルの内容を、左側に書いたコマンドへキー入力として送る(リダイレクト)

>」=この文字の、左側に書いたコマンドの実行結果を、右側に書いたファイルへと書き出す(リダイレクト)

"」=囲んだ部分を一塊の文字列として扱う

%」=変数を使用する際に使う

&」=改行したのと同じ意味。1行に複数の処理を書く時に使う。

( )」=forやifコマンドを使う場合に、行う処理等を一塊として囲む(ブロック、グループ化)

|」=この文字の、前にあるコマンドの実行結果(画面に表示される文字)を、後にあるコマンドに入力データとして渡す(パイプ)

^」=この文字の、直後の記号の意味を無くし、文字として認識させる。(エスケープ)

ファイルやフォルダの場所について

ファイルやフォルダの「場所」(アドレス)は、「パス」(Path)と呼びます。

「C:\111\222\AAA.txt」のように、「\」区切りで表現します。

上記の意味は、「C:」ドライブ内の、「111」フォルダ内の、「222」フォルダ内の、「AAA.txt」ファイルという意味です。

C:\111\222\AAA.txt」のように、
ドライブから始まるパスを「絶対パス」や「フルパス」と呼びます。

AAA.txt」のように、
名前だけ、又は、ドライブから始まっていないパスを「相対パス」と呼びます。
カレントディレクトリ(作業中の場所)から見ての相対という意味です。

又、バッチファイルにおいて、
.\」は、「カレントディレクトリ」を表し、
..\」は、「1つ上の階層(フォルダ)」を表し、
..\..\」は、「2つ上の階層」を表します。

例えば、
C:\AAA」フォルダと、
C:\BBB」フォルダがあり、

C:\AAA」がカレントディレクトリだった場合、

C:\AAA」から見た「C:\BBB」フォルダは、
1つ上の階層にある、『BBB』フォルダ」ですから、
..\BBB」と記述します。

サンプル

以下はバッチファイルのサンプルです。

手打ちするか、コピー&ペーストして、必要な部分は書き換えて実行してみてください。

コメントを書き込む

rem」を使って、コメントを書き込みます。

コメントとは、処理には影響を与えないメモのようなものです。

以下が例です。

@echo off

rem ■ フォルダの作成
md "新しいフォルダ"

pause

画面に文字を表示する

バッチファイル(コマンドプロンプト)の画面に文字を表示するには、「echo」コマンドを使います。

以下は、「表示したい文字」と2回表示する例です。

@echo off

echo 表示したい文字

echo.表示したい文字

pause

echo」の後には、半角スペースか、「.」(半角ドット)を入れます。

半角スペースだと正しく表示されないケースもありますし、「.」(半角ドット)だと正しく表示されないケースもありますので、ケースに合わせて使い分けると良いかと思います。

プログラムの順次起動

メモ帳」を起動し、それが終了したら、次に「電卓」を起動する例です。

"C:\Windows\System32\notepad.exe"
"C:\Windows\System32\calc.exe"

ファイルのパス(場所)を書いて、半角の「"」で前後を囲むだけです。

ケースによっては、ファイル名だけで良かったり、「"」は不要な場合もあります。

ファイルのフルパス(完全な場所)の取得方法は、最近のWindowsの場合は、目的のファイルを「Shift」キーを押しながら右クリックし、「パスのコピー」や「パスとしてコピー」等をクリックすると取得出来ます。

又は、フォルダ上部にある場所が書かれたアドレスバー内を右クリックし、「アドレスをテキストとしてコピー」をクリックしても良いです。

後は、テキストエディタで、そのフルパスを書き込みたい場所をクリックし、「Ctrl」キーを押しながら「V」キーを押すと貼り付けられます。又は、右クリックして「貼り付け」をクリックしても良いです。

プログラムの一括起動

「メモ帳」と「電卓」を一括で起動する例です。

start "" "C:\Windows\System32\notepad.exe"
start "" "C:\Windows\System32\calc.exe"

行頭に「start "" 」を書き、その後にファイルのパスを書きます。

最初の「""」内にはウィンドウタイトルを書きますが、今回はこれを指定しない為、空の「""」となっています。

プログラムを時間を空けて実行する

「メモ帳」と「電卓」を時間を空けて実行する例です。

@echo off
start "" "C:\Windows\System32\notepad.exe"
ping localhost -n 4 >NUL:
start "" "C:\Windows\System32\calc.exe"

ここでは「ping」というコマンドを利用して「3秒」待つ処理を実現しています。

本来はネットワーク関係のコマンドなので、「1」足して「4」と記述する必要があります。

古いWindowsでも対応出来るように「ping」コマンドでの例を書きましたが、少なくともWindows10であれば「sleep 3」と書けば「3秒」待つ処理が実現できます。

プログラムに引数を付けて実行する

Internet Explorerを、引数付きで実行します。

引数」とは、実行対象に渡すデータの事です。

内容は、設定だったり、ファイルのパス(場所)だったり、追加のオプションだったり、様々です。

今回はURLを付けて、Internet ExplorerでそのURLを開くように指定します。

start "" "iexplore.exe" "https://ja.wikipedia.org/"

ファイルやURLは、「"」で囲まなくても良い場合もありますが、囲んでおいた方が無難です。

URLに「%」が含まれる場合は、「%%」に書き換えて記述してください。

ファイルのコピー

C:\xxx\コピー元.txt」ファイルを、「C:\xxx\コピー先.txt」へコピーする例です。

copy /b "C:\xxx\コピー元.txt" "C:\xxx\コピー先.txt"

copy」は、コピー用のコマンドです。

/b」は、内容を変更せずそのままコピーするオプション(設定)です。

上記はフルパス(完全な場所)で記述していますが、バッチファイルと同じ場所にあるファイルなら、基本的にはファイル名だけで良いです。

フォルダのコピー

C:\xxx\コピー元フォルダ」ファイルを、「C:\xxx\コピー先フォルダ」へコピーする例です。

xcopy /E /I /H /Y "C:\xxx\コピー元フォルダ" "C:\xxx\コピー先フォルダ"

xcopy」は、フォルダごとコピーするコマンドです。

/E」は、空のフォルダもコピーするオプションです。

/I」は、コピー先フォルダが無ければ作成するオプションです。

/H」は、隠しファイルやシステムファイルもコピーするオプションです。

/Y」は、既存ファイルの上書きの確認を行わないオプションです。

ファイルの作成

あああ」という内容を、「AAA.txt」という名前のファイルに書き出す例です。既存のファイルは上書きされますのでご注意ください。

echo.あああ> "AAA.txt"

echo」は、それに続く文字を画面に出力するコマンドです。

>」は「リダイレクト」と呼ばれ、左側のコマンドの結果を、右側で指定したファイルに書き出すものです。

つまり、今回は、「echo.あああ」の実行結果である「あああ」をファイルへ書き出しています。

ただし、バッチファイルにおいて一部の半角記号全角スペースは特殊な意味持ちますので、それらを使う場合は、「"」で囲んで「"あああ"」のように記述した方が無難ですが、その場合は「"」も出力されます。

ファイルに追記する

あああ」という内容を、「AAA.txt」という名前のファイルに追記する例です。

echo.あああ>> "AAA.txt"

>>」は、左側のコマンドの実行結果(画面に表示される文字)を、右側で指定したファイルに追記するものです。

上記の例で言えば、「echo.あああ」は、画面に「あああ」と表示する処理ですから、その文字がファイルに保存されます。

改行が挿入されますので、このバッチファイルを3回繰り返し行うと、以下のようなテキストファイルになります。

あああ
あああ
あああ

空のファイルを作成する

空のファイル「AAA.txt」を作成する例です。

copy nul "AAA.txt"

nul」はWindowsが用意した空ファイルです。それを「copy」コマンドでコピーしています。

ファイルを移動する

C:\AAA\111.txt」ファイルを、「C:\BBB」フォルダ内へ移動する例です。

move "C:\AAA\111.txt" "C:\BBB"

move」は、移動用のコマンドです。

以下は、「C:\AAA」フォルダ内の「〜.txt」という名前のファイルを、「C:\BBB」フォルダ内へ移動する例です。

move "C:\AAA\*.txt" "C:\BBB"

*」は、ワイルドカードと言って、日本語で言えば「」や「なんとか」というような意味です。

ファイルの削除

C:\xxx\削除対象.txt」ファイルを削除する例です。

del /q "C:\xxx\削除対象.txt"

/q」は、削除しても良いかをユーザーに確認せずに削除するオプションです。

以下は、「C:\xxx」フォルダ内の、サブフォルダ(そのフォルダ内にあるフォルダ)内も含めて、全ての「〜.log」ファイルを削除する例です。

del /q /s "C:\xxx\*.log"

/s」は、サブフォルダも含めるオプションです。

*.log」は、「〜.log」ファイルという意味です。

フォルダの削除

C:\AAA\BBB」フォルダを削除する例です。

rd /q "C:\AAA\BBB"

/q」は、削除の確認をしないオプションです。

ただし、上記では、ファイルが入っていると削除できません。

ファイルごと削除する為には、「/s」オプションも付けます。

rd /q /s "C:\AAA\BBB"

フォルダの指定は間違わないようにご注意ください

カレントディレクトリの変更

カレントディレクトリを変更するには、「pushd」か「cd」コマンドを使います。

以下は、「pushd」コマンドで、カレントディレクトリを「C:\AAA\BBB」フォルダに変更する例です。

pushd "C:\AAA\BBB"

又、「pushd」コマンドで変更されたカレントディレクトリを元の場所に戻す場合は、「popd」と記述すると戻ります。

以下は「cd」コマンドを使った例です。

cd /d "C:\AAA\BBB"

/d」は、異なるドライブでもカレントディレクトリを変更するオプションです。例えば、「E:\111」フォルダ等です。

バッチファイル内で、別のバッチファイルを実行する

バッチファイル内で、同じ場所にある「002.bat」を呼び出して実行する例です。

call "002.bat"

イコールではないですが、記述した箇所に「002.bat」の内容が入るようなイメージです。

全く違う場所にあるバッチファイルを実行する場合は、フルパス(絶対パス)
C:\AAA\002.bat」のような感じで記述してください。

プログラムを終了させる

以下は、「taskkill」コマンドを使って、メモ帳(notepad.exe)を終了させる例です。

taskkill /im "notepad.exe"

/im」は、イメージ名を指定するオプションです。

強制終了させる場合は、「/f」オプションを付けます。

ただ、「/im "notepad.exe"」の間には入れないでください。

以下のようにします。

taskkill /im "notepad.exe" /f

変数を代入する

変数」とは、文字を入れる入れ物です。

変数に、文字を入れる事を「代入」と呼びます。

代入するには、「set」コマンドを使います。

書式は以下の通りです。

set "変数の名前=入れる文字"

以下は、変数「AAA」に、「111」を代入する例です。

set "AAA=111"

以下は、変数「AAA」に、「"111"」(「"」付き)を代入する例です。

set AAA="111"

変数を使用するには、変数名を「%」で囲んで使います。

「set "AAA=111"」を実行し、
変数「AAA」に、「111」が代入されている状態の場合、
%AAA%」は、「111」となります。

つまり、
「set "AAA=111"」を実行した後に、
「md "%AAA%"」を実行すると、
「md "111"」を実行したのと同じとなり、
111」というフォルダが作成されます。

又、以下のような、指定ファイルにテキストを出力するバッチファイルがあったとします。

echo.001>> "C:\AAA\xxx.log"
echo.002>> "C:\AAA\xxx.log"
echo.003>> "C:\AAA\xxx.log"

上記では、「C:\AAA\xxx.log」が重複してますので、以下のようにする事も出来ます。

set "出力ファイル=C:\AAA\xxx.log"

echo.001>> "%出力ファイル%"
echo.002>> "%出力ファイル%"
echo.003>> "%出力ファイル%"

上記のようにしますと、出力ファイルのパス(場所)を変更したくなった時に、変数の値を書き換えるだけで済みます。

又、バッチファイル実行中に、ユーザーが変数の値を入力するようにも出来ます。

set」コマンドに、「/p」オプションを付けます。

以下のような書式です。

set /p "変数名=表示するメッセージ"

変数「AAA」の値をユーザーに尋ねる例は、以下の通りです。

@echo off

set /p "AAA=「AAA」の値を入力し、Enterキーを押してください。"

echo."%AAA%"が入力されました。

pause

又、注意点として、「del」コマンドの対象に変数を使う場合は、
del /q /s "%削除するフォルダ%"」と記述して、
変数「削除するフォルダ」が、何らかの理由で空だった(代入出来なかった)場合、
del /q /s ""」を実行したのと同じになり、
カレントディレクトリ内の(サブフォルダ内も含む)全てのファイルが削除されてしまいます

これは、バッチファイルを複数に分けていて、サブのバッチファイルを間違えて単体で起動してしまった場合等に起こります。

del /q /s」と変数を一緒に使う場合は、変数が空にならないようにご注意ください。

メッセージボックスを表示する

VBScript」と呼ばれる、Windows標準のスクリプト言語を、バッチファイルから利用して、メッセージボックスを表示する例です。

スクリプト」とは、処理が掛かれたテキストファイルの事です。

echo.msgbox "メッセージ内容",vbInformation,"ウィンドウタイトル"> "%TEMP%\Message.vbs"

start "" "%TEMP%\Message.vbs"

echo.」と「>」の間にある部分がスクリプトで、それを「%TEMP%\Message.vbs」ファイルに書き出しています。

%TEMP%」は、一時的なファイルやフォルダを作成する為にWindowsによって予め用意されているフォルダです。

その後の「start "" "%TEMP%\Message.vbs"」で、作成したスクリプトを実行し、メッセージボックスを表示しています。

メッセージを表示するスクリプトを作成し、すぐに実行している訳です。

又、「vbInformation」の部分を変更する事で、表示するウィンドウの種類を変更出来ます。

  • vbInformation」=情報
  • vbCritical」=警告
  • vbExclamation」=注意
  • vbQuestion」=問い合わせ

又、タイミング的に、「Message.vbs」が表示される前に、次の「Message.vbs」が出力されてしまうと、上書きされて内容が変わってしましますので、この処理を短い間隔で複数回使う場合は、出力ファイル名を別にしてください。

ドラッグ&ドロップで処理する

処理したいファイルやフォルダを、バッチファイルのアイコン上にドラッグ&ドロップ(クリックしたまま移動させて離す)すると、そのファイルやフォルダのパス(場所)を、バッチファイルから参照出来るようになります。

つまり、バッチファイルでそのファイルを処理出来るようになります
画像
画像

これは、「C:\xxx\バッチ.bat C:\xxx\テキスト.txt」のように実行したのと同じ形になります。

C:\xxx\バッチ.bat」に、「C:\xxx\テキスト.txt」を第1引数として渡し、実行しています。

以下は、ドラッグ&ドロップされたファイル(第1引数)のフルパス(完全な場所)を表示する例です。

@echo off

echo."%~1"

pause

%1」は、「第1引数」を表します。つまり、ドラッグ&ドロップされた「C:\xxx\テキスト.txt」です。

%~1」は、「第1引数」から「"」を取り除いたものです。

つまり、「"%~1"」は、第1引数に「"」が付いている場合は取り除き、再度「"」で囲み直しています。

""C:\xxx\テキスト.txt""」と二重になってしまうのを防ぐ為です。

又、以下のような記述方法も出来ます。

  • 「%~d1」=対象のドライブ部分
  • 「%~p1」=対象がある場所(ドライブ部分を除く。末尾は「\」なので注意。)
  • 「%~n1」=対象の名前部分(「.」と拡張子を除く)
  • 「%~x1」=対象の拡張子部分(「.」を含む)

又、以下のように組み合わせる事も出来ます。

  • 「%~dp1」=対象がある場所(末尾は「\」なので注意)
  • 「%~nx1」=対象の名前(「.」と拡張子を含む)
  • 「%~dpnx1」=対象のフルパス(完全な場所)

又、ファイルサイズ、日時、属性も取得出来ます。

  • 「%~z1」=対象のファイルサイズ
  • 「%~t1」=対象の更新日時
  • 「%~a1」=対象の属性

又、第2引数は、「%2」となります。

%0」は、バッチファイル自体のフルパスが代入されています。

又、ドラッグ&ドロップした場合の注意点は、カレントディレクトリ(現在作業しているフォルダ)が、バッチファイルと同じ場所ではなくなる事です。

バッチファイルと同じ場所にあるファイルを、「テキスト.txt」のような感じで指定は出来ません。

C:\xxx\テキスト.txt」のような感じで、フルパスで書く必要があります。

バッチファイルがある場所をカレントディレクトリにしたい場合は、バッチファイルの最初の方に以下を記述します。

pushd "%~dp0"

pushd」は、カレントディレクトリを変更するコマンドです。

%~dp0」は、バッチファイルがある場所を表します。(末尾は「\」なので注意)

日時を使う

変数の「date」と「time」を使って、現在日時を利用する例です。

以下は、画面に日時を表示する例です。

@echo off

echo.日付は「%date%」です。

echo.時刻は「%time%」です。

pause

結果は、以下のような感じになります。

日付は「2018/01/23」です。

時刻は「12:30:11.22」です。

変数の一部を使う

「%変数名:~開始箇所,終了箇所%」という書式を使います。

以下は、変数「date」内の、「」に当たる部分だけ使う例です。

例えば、今日の日付が「2018/01/23」だったとします。

「%date%」と記述すると、「2018/01/23」となります。

「%date:~0,4%」と記述すると、「頭から数えて、0文字目から、4文字」となり、「2018」となります。

「%date:~-10,4%」と記述すると、「-」が付いていますから、「末尾から数えて、10文字目から、4文字」となり、「2018」となります。

変数内を置換する

「%変数名:置換前の文字=置換後の文字%」という書式を使います。

例えば、今日の日付が「2018/01/23」だったとします。

「%date:/=-%」と記述すると、「/」が「-」に置換され、「2018-01-23」となります。

「%date:/=%」と記述すると、「/」が無くなり、「20180123」となります。

こうすると、変数「date」「time」がファイル名等にも使えて便利です。

フォルダ内のファイルを処理する

フォルダ内の複数のファイル同様の処理を行いたい場合は、「for文」を使います。

書式は以下の通りです。

for %%代入先アルファベット   in (対象ファイル)   do (
行う処理 %%代入先アルファベット
)

真ん中にある「in 〜」部分は、処理の対象を指定しています。
ここから対象を1つずつ取り出して処理します

最初にある「for 〜」部分は、「in」で取り出した1つのデータを格納する(代入する)アルファベット1文字を書きます。
又、その他オプションを書き込む場合もあります。

最後にある「do 〜」部分は、実行する処理です。
for」で代入されたデータを、「%%アルファベット」という形式で使用する事が出来ます。「%%l」のような感じです。

do」部分で、複数の処理を書く場合は、例文のように、「 ( ) 」内に改行を入れて書きます。

処理が1つのみの場合は、そのまま続けて処理を書いて構いません。
例えば、以下のような感じです。

for%%l   in ("C:\xxx\*.txt")   do echo %%l

上記の例では、分かりやすいように半角スペースを多めに入れていますが、通常は1つで構いません。

又、上記の例では、サブフォルダ(そのフォルダ内のフォルダ)内のファイルは対象としません。開いてすぐの場所にあるファイルのみ対象です。

順序を表すと、以下のような感じです。

for ②ここに入れ込み   in (①ここから1つ取り出し)   do (
③この処理を行う
)

以下は、「C:\xxx」フォルダ内の、「*.txt」(〜.txt)ファイルのパスを表示する例です。

@echo off

for %%l   in ("C:\xxx\*.txt")   do (
echo %%l
)

pause

for %%l」は、「%%l」に代入する、という意味です。

in ("C:\xxx\*.txt")」は、
C:\xxx」フォルダ内の、「*.txt」(〜.txt)ファイルを対象にする、という意味です。
サブフォルダ内のファイルは対象としません。

アルファベットに代入されるパス(場所)は、
C:\xxx」というような形式で、
"C:\xxx"」のように「"」で囲まれませんので、ご注意ください。

"」で囲む必要がある場合は、自分で「"%%l"」と記述する必要があります。

do (echo %%l)」は、「echo %%l」行う、
つまり、「%%l」に入っている内容を画面に表示する、という意味です。
これでファイル名が表示されます。

以下は、サブフォルダ内のファイルも対象にする例です。

@echo off

for /r "C:\xxx" %%l   in ("*.txt")   do (
echo %%l
)

pause

"C:\xxx"」は、対象フォルダです。

/r」は、サブフォルダも対象にするオプションです。

in ("*.txt")」は、対象ファイルを指定しています。

ファイル内の行を1行ずつ処理する

ファイル内の行1行ずつ取り出して処理するには、「for文」を使います。

以下は、「C:\xxx\リスト.txt」から1行ずつ取り出して処理する例です。

@echo off

for /f "usebackq delims=" %%l   in ("C:\xxx\リスト.txt")   do (
echo %%l
)

pause

usebackq」は、ファイル指定に「"」を使う場合等に使います。

これを付けないと、「"」で囲まれた部分自体が、「ファイルのパス」ではなく、「入力データ」そのものとして扱われてしまいます。

delims=」は、行の中の区切りを指定します。

初期設定では、「半角スペース」や「タブ」が区切りの文字ですが、「=」の後に何も書かない事により、区切りの文字を無しにしています。つまり、行を途中で区切らないという意味です。

ファイルの情報を取得する

for文」を利用して、指定ファイルの情報を取得する方法です。

以下は、「C:\Windows\notepad.exe」ファイルの、ファイルサイズを表示する例です。

for %%l   in ("C:\Windows\notepad.exe")   do echo 「%%l」は「%%~zl」バイトです。

%%l」には、「C:\Windows\notepad.exe」が代入されます。

%%~zl」は、「%%l」のファイルサイズを表します。

以下が上記の実行結果です。

"C:\Windows\notepad.exe"」は「236032」バイトです。

又、以下のように、取得した値を変数に代入してから使う方法もあります。

for %%l   in ("C:\Windows\notepad.exe")   do set "ファイルサイズ=%%~zl"

echo 「C:\Windows\notepad.exe」は「%ファイルサイズ%」バイトです。

set "ファイルサイズ=%%~zl"」で、変数「ファイルサイズ」に、「C:\Windows\notepad.exe」のファイルサイズを表す「%%~zl」を代入しています。

そうすると、「%ファイルサイズ%」という記述で、対象のファイルサイズを使用出来ます。

別の処理へ移動する

goto」コマンドを使って、別の処理へと移動する方法です。

以下は、「あああ」と表示する処理を飛ばす例です。

@echo off

goto AAA

echo.あああ

:AAA

echo.いいい

pause

goto AAA」は、「AAA」というラベル(目印)に移動する処理です。

echo.あああ」は、画面に「あああ」と表示する処理です。

:AAA」は、ラベルです。頭に「:」を付けるとラベルとなります。

goto AAA」で、「:AAA」にジャンプするイメージですから、間にある処理は無視されます。つまり、画面に「あああ」は表示されません。

以下が実行結果です。

いいい

続行するには何かキーを押してください . . .

処理の終了

exit」コマンドを使うと、処理を終了出来ます。

以下は、「AAA」フォルダだけを作成し、バッチファイルを終了する例です。

md "AAA"

exit

md "BBB"

exit」を実行した時点で、バッチファイルが終了します。「BBB」フォルダは作成されません。

又、「/b」オプションを付けて、「exit /b」とすると、「この処理は終了する」という意味合いになります。

例えば、「call」コマンドで、別のバッチファイルや、別の処理(サブルーチン)を行っていた場合、その中に「exit /b」とすると、その処理はそこで終了となり、メインのバッチファイルへと戻り、メインの続きの処理が実行されます。

サブの処理を実行する

call」コマンドを使って、サブの処理(サブルーチン)を実行する例です。

何度も繰り返し使う処理は、別のバッチファイルや、サブルーチンにしておけば、一度書くだけで済むので便利です。

まずは、別のバッチファイルを用意して、それをメインのバッチファイルから呼び出して使う例です。

メイン.bat」と「サブ.bat」を用意します。

以下は、「メイン.bat」の内容です。

@echo off

echo.メインを開始しました

call "サブ.bat"

echo.メインを終了しました

pause

以下は、「サブ.bat」の内容です。

echo.サブを開始しました

echo.サブを終了しました

メイン.bat」の「call "サブ.bat"」の部分に、「サブ.bat」の内容が入るイメージです。

しかし、ラベルは実行中のバッチファイル内のもののみ有効です。

以下は、実行結果です。

メインを開始しました

サブを開始しました

サブを終了しました

メインを終了しました

次に、一つのバッチファイル内に、サブの処理(サブルーチン)を書く例です。

@echo off

rem --------------------

echo.メインを開始しました

call :サブルーチン

echo.メインを終了しました

pause

exit

rem --------------------

:サブルーチン

echo.サブを開始しました

echo.サブを終了しました

exit /b

rem --------------------

call :サブルーチン」の部分に、「:サブルーチン」〜「exit /b」の内容が入るイメージです。「exit /b」によってサブルーチンが終了されます。

上の方にある「exit」が、バッチファイル自体の終了地点となります。

注意点は、「goto」コマンドと違い、「call」コマンドの場合は、「call :ラベル名」という風に、ラベル名の前に「:」を付ける必要がある事です。

「もし〜なら」という処理

if」文を利用すると、「もし〜なら」という処理を行えます。

これを、条件分岐と呼びます。

以下は、もし、「C:\Windows\notepad.exe」があれば、「ありました」と表示する例です。

@echo off

if exist "C:\Windows\notepad.exe" echo.ありました

pause

if exist」は、「もし、あれば」という意味です。

その後の、「"C:\Windows\notepad.exe"」が対象ファイルです。

その後に、「あった場合」に行う処理を書きます。

又、「if exist」を、「if not exist」に変更すると、「無かった場合」という意味になります。

複数の処理を行いたい場合は、行う処理を「( )」で囲んで、改行を入れ、以下のように書きます。

@echo off

if exist "C:\Windows\notepad.exe" (
echo ありました
echo ありました
echo ありました
)

pause

( )」で囲んだ部分は、「ブロック」(ブロック文)と呼びます。

又は、以下のように、「if not exist」と「goto」を使って、対象が無かった場合は処理を飛ばすという事も出来ます。

言い換えれば、対象があった場合のみ処理を行う、という事です。

@echo off

if not exist "C:\Windows" goto END_Windows
echo 「Windows」フォルダを発見しました
:END_Windows

if not exist "C:\Windows2" goto END_Windows2
echo 「Windows2」フォルダを発見しました
:END_Windows2

pause

goto」は、指定した行(ラベル)まで移動するという処理です。ジャンプするようなイメージです。

:END_Windows」と「:END_Windows2」は、「ラベル」と呼ばれる目印となる行です。「:」(半角コロン)から始まります。名前は任意です。

以下は、「もし、〜が、あった場合はこれを実行し、それ以外の場合(無ければ)はこれを実行する」という処理です。

@echo off

if exist "C:\Windows\notepad.exe" (
echo ありました
) else (
echo ありませんでした
)

pause

else」は「それ以外の場合」という意味です。

1つ目のブロックが、「あった場合」の処理です。

2つ目のブロックが、「それ意外の場合(無かった場合)」の処理です。

if」(条件)を複数付ける事も出来ます。

以下は、ユーザーが入力した血液型を表示する例です。

@echo off

echo.
echo. 血液型を入力し、Enterキーを押してください
echo.

set /p "入力="

if /i "%入力%"=="a" (
echo 入力された血液型は「A」でした

) else if /i "%入力%"=="b" (
echo 入力された血液型は「B」でした

) else if /i "%入力%"=="ab" (
echo 入力された血液型は「AB」でした

) else if /i "%入力%"=="o" (
echo 入力された血液型は「O」でした

) else (
echo 不明な血液型でした

)

pause

set /p "入力=" 」は、ユーザーからの入力を、変数「入力」に代入する処理です。

if /i "%入力%"=="a"」は、「%入力%」(ユーザーが入力した値)が「a」であれば、という意味です。

==」は、「等しい」という意味で、「=」が2個なので、1個と間違わないようにご注意ください。

/i」オプションは、大文字/小文字を区別しない、という意味です。

数値の比較も出来ます。

以下は、ユーザーが入力した数値を、「100」と比較する例です。

@echo off

echo.
echo. 数値を入力し、Enterキーを押してください
echo.

set /p "入力="

if %入力% EQU 100 echo 「100」と等しい数値です
if %入力% NEQ 100 echo 「100」と等しくない数値です
if %入力% GEQ 100 echo 「100」以上の数値です
if %入力% GTR 100 echo 「100」より大きい数値です
if %入力% LEQ 100 echo 「100」以下の数値です
if %入力% LSS 100 echo 「100」より小さい数値です

pause

%入力%」は、ユーザーが入力した数値を表す変数です。

その直後のアルファベット3文字が、「比較演算子」と呼ばれるもので、比較方法を表します。

注意点は、変数「入力」が空だった場合、構文が崩れ、バッチファイル(コマンドプロンプト)が場合によっては終了してしまいます

これを回避するには、「if %入力%0 GEQ 1000」のように、「%入力%」と「100」の末尾数字を付加すると回避出来ますが、これにつきましては、もしかしたら、もっとスマートな方法もあるかも知れません。

パスを通す

「パスを通す」とは、プログラムを名前を指定しただけで実行出来るようにする事です。

例えば、「C:\AAA\BBB.exe」であれば、「BBB」と記述するだけで実行出来るようにするという事です。

Windowsには、環境変数(環境によって異なる変数)が用意されており、その中に「Path」という環境変数があります。

「Path」には、様々なフォルダが登録されており、名前だけを指定してプログラムを実行した場合は、この「Path」に登録されたフォルダが参照され、そこに指定したプログラムがあれば実行されます。

つまり、名前だけでプログラム等を指定した場合は、ここに書かれたフォルダ内を探すようになっています。

例えば、「aaa.exe」というプログラムをダウンロードして、「aaa」と記述しただけで使えるようにしたい場合は、既にパスが通っているフォルダにそのプログラムを入れるか、そのプログラムが入っているフォルダを「Path」に登録する必要があります。

既にパスが通っているフォルダにそのプログラムを入れる場合は、例えば、「C:\WINDOWS」フォルダ等がパスの通ったフォルダですから、そこに目的のプログラムをコピーします。

ただ、このフォルダは、Windowsにとって重要なフォルダですから、同名のファイルがあった場合は、上書きしないでください。

又、PCをリカバリーした場合は、上記でコピーしたファイルは消えますので、別の場所にバックアップを取っておくと良いでしょう。

プログラムが入っているフォルダを「Path」に登録する場合は、Windowsの環境変数を変更します。

プログラムを入れる用のフォルダをCドライブ直下等に1つ作っておき、それを登録すると良いでしょう。

一度登録すれば、その後はそのフォルダにプログラムを入れるだけでパスが通ります。

パスの通し方は、Windows10の場合はこちらをご覧ください。

その他のWindowsの場合は、お使いのWindowsのバージョン + 「パス 通す」等のワードでWEB検索してみてください。「Windows11 パス 通す」等です。

お使いのWindowsのバージョンが分からない場合は、Windowsロゴのキーを押しながら「Pause/Break」キーを押すと確認出来ます。

ファイルのダウンロード

curl」というプログラムを利用してファイルをダウンロードする方法です。

まず、Windows10の場合は、Windowsロゴのキーを押しながら「R」キーを押し、出た小窓に「curl」と半角で打ち込み、Enterキーを押してみてください。

見付からない旨のエラーメッセージが出なければ、マイクロソフト版のcurlがインストールされています。

curlがインストールされていない環境の場合は、WEBからダウンロードします。

こちらの「curl」のダウンロードページを開き、
64ビット版のWindowsをお使いの場合は「64bit」、
32ビット版のWindowsをお使いの場合は「32bit」、
をダウンロードします。

不明の場合は、Windowsロゴのキーを押しながら「Pause/Break」キーを押すと確認出来ます。

保存した圧縮ファイルを展開(解凍)します。 (展開方法が分からない場合

展開して出来たフォルダを開いていくと「bin」フォルダがあるかと思いますので、その中にある「curl.exe」(.exe)等の全ファイルを、「C:\WINDOWS」フォルダ、又は、パスの通ったフォルダにコピーします。これでパスが通り、使える状態となります。

以下は、curlの書式です。

curl -k -L -o "出力ファイル" "ダウンロードURL"

-k」オプションは、SSLを使用しているときに安全でないサーバー接続を許可するオプションです。ダウンロード出来ない問題を回避します。

-L」オプションは、リダイレクトに対応します。

-o」オプションは、出力ファイルを指定するものです。

以下は、「https://www.google.co.jp/」を、「ダウンロード.txt」としてダウンロードする例です。

@echo off

curl -k -L -o "ダウンロード.txt" "https://www.google.co.jp/"

pause

バッチファイル内でヘルプ(英語)を確認する場合は、以下の一文を記述して実行してください。

curl --help all & pause

ヘルプをファイル出力する場合は、以下の一文を記述して実行してください。

curl --help all > "curl ヘルプ.txt"

詳しい使い方は、解説サイトをご覧ください。

テキストファイルの文字コードを変更する

テキストファイルは、本来は人間が読めないデータの塊ですが、「文字コード」と呼ばれる規格に準じて文字に変換すると、人間が読める文字となります。

文字コードは、「Shift_JIS」(ANSI)、「UTF-8」、「UTF-16」(Unicode)等があります。

例えば、WEBページは「UTF-8」という文字コードで書かれている事が多いですが、Windowsで作成されるテキストファイルは、「ANSI」(Shift_JIS)という文字コードの場合が多いです。

行う処理によっては、入力ファイルの文字コードが「ANSI」(Shift_JIS)でないと正常な処理が出来ないケースがあるので、そういう場合は入力ファイルの文字コードを変換します。

今回は、「nkf」というプログラムを使って、文字コードを変換する方法をご紹介します。

nkfは、大体の文字は正しく変換出来ますが、一部、正しく変換出来ない文字もありますので、その点はご留意ください。

こちらの「nkf」のダウンロードページを開き、「このソフトを今すぐダウンロード」をクリックし、ファイルを保存します。ページに広告があるのでご注意ください。
保存方法が分からない場合

保存した圧縮ファイル「nkfwin」(.zip)を展開(解凍)します。
展開方法が分からない場合

展開して出来た、
「nkfwin」フォルダ内の、
「vc2005」フォルダ内の、
「win32(98,Me,NT,2000,XP,Vista,7)ISO-2022-JP」フォルダ内の、
「nkf」(.exe)ファイルを、
「C:\WINDOWS」フォルダ、又は、パスの通ったフォルダにコピーします。

これでパスが通り、nkfが使える状態となります。

以下は使用例です。

文字コードを「Shift_JIS」に変換。

nkf -s --overwrite "対象ファイル.txt"

--overwrite」は上書き用のオプションです。

文字コードを「UTF-8(BOM付き)」に変換。

nkf -w8 --overwrite "対象ファイル.txt"

BOM」とは、テキストファイルの先頭に付けられるUnicodeの種類(UTF-〇)を表す小さなデータです。

文字コードを「UTF-8(BOM無し)」に変換。

nkf -w --overwrite "対象ファイル.txt"

入力ファイルと出力ファイルが違う場合。

nkf -s "入力ファイル.txt" > "出力ファイル.txt"

文字列の置換

文字列を置換する方法です。

変数内の文字列置換

使用時(参照時)に置換する書式です。

%変数名:置換前=置換後%

変数自体を置換する書式です。

set "変数名=%変数名:置換前=置換後%"

変数「AAA」内の、文字列「BBB」を「CCC」に置換する例です。

set "AAA=%AAA:BBB=CCC%"

ファイル内の文字列置換

入力ファイル「入力ファイル.txt」内の、文字列「AAA」を「BBB」に置換して、出力ファイル「出力ファイル.txt」として出力する例です。(既存の「出力ファイル.txt」は削除されます。)

@echo off

del /q "出力ファイル.txt"

setlocal enabledelayedexpansion

for /f "usebackq delims=" %%a in ("入力ファイル.txt") do (
set "line=%%a"
echo !line:AAA=BBB!>> "出力ファイル.txt"
)

endlocal

上記の解説です。

del /q "出力ファイル.txt"
前回の出力ファイルを削除します。
setlocal enabledelayedexpansion
遅延環境変数を有効にし、for文内で代入した変数を、「!変数名!」形式ですぐに使えるようにします。これを書かないと通常は使えません。
usebackq
今回は、ファイル名の指定で「"」を使えるようする為に付けています。
他には、for文で「in (`コマンド`)」形式で記述して、コマンドの実行結果を対象とする場合にも使います。
delims=
区切りとなる文字を指定します。「=」の後に何も書かなければ区切り無しで、行全体が対象になります。
set "line=%%a"
行を変数「line」に代入します。
echo !line:AAA=BBB!>> "出力ファイル.txt"
変数「line」内の文字列を置換して、「出力ファイル.txt」に追記して保存します。
endlocal
遅延環境変数を無効にします。(ローカライズの終了)

ただ、上記はあくまで簡易的なもので、正規表現(高度な置換)には対応していませんし、特殊な意味を持つ半角記号の問題もありますし、Perl、Ruby、AWK、sed、等の外部のコンソールアプリケーション(コマンドプロンプトで利用出来るアプリケーション)を利用した方が文字列の置換は簡単かと思います。

sedは、最新バージョンで改善されているかは分からないですが、稀に正しく日本語を処理出来ない場合があったのでご注意ください。

バッチファイルを最小化で実行する

バッチファイルを最小化で実行する方法です。

ショートカットから、バッチファイルを最小化で実行する

バッチファイルを右クリックしたまま、デスクトップやフォルダの余白部分に持って行き、右クリックを放し、出たメニューから「ショートカットをここに作成」をクリックします。
画像

以下のようにショートカットが作成されます。
画像

作成されたショートカットを右クリックし、「プロパティ」をクリックします。
画像

実行時の大きさ」の所の欄をクリックし、「最小化」をクリックし、「OK」をクリックします。
画像

後は、当該のショートカットをダブルクリックして実行すると、バッチファイルが最小化の状態で起動されます。

バッチファイルから、バッチファイルを最小化で実行する

起動する側のバッチファイルに、以下のような感じで記述します。

以下は、「C:\xxx\バッチファイル.bat」を最小化で実行する例です。

start /min cmd /c, "C:\xxx\バッチファイル.bat"

start」は、ファイルを実行するコマンドで、「/min」は、最小化で実行するオプションです。

cmd」は、コマンドプロンプト自体で、「/c」は、コマンドを直接記述するオプションです。「,」に続けてコマンドを記述します。今回はバッチファイルを指定して実行しています。

バッチファイルから、バッチファイルのショートカットを実行する

AAA.bat」のショートカットを作成すると、
AAA.bat - ショートカット」という感じの名前のショートカットが作成されますが、
これには隠された「lnk」という拡張子が付いており、実際は、
AAA.bat - ショートカット.lnk」というファイル名となります。

その為、バッチファイルからこのショートカットを実行するには、以下のような感じで記述します。

start /min "" "AAA.bat - ショートカット.lnk"

start」は、ファイルを実行するコマンドです。

/min」は、最小化で起動するオプションです。

""」は、ウィンドウタイトルを記述するものですが、今回は空です。

又、作成したショートカットの名前を、
AAA.bat - ショートカット」から、
AAA」に変更しておくと、
AAA.lnk」という感じで記述出来るので楽です。

バッチファイルをタスクトレイに格納する

TaskTrayPlus」というフリーソフトを使って、バッチファイルをタスクトレイに格納する方法です。

ダウンロードとセットアップ

こちらの「TaskTrayPlus」のダウンロードページを開き、「Download」の所にある「Ver 〜」をクリックし、ファイルを保存します。(保存方法が分からない場合
画像
(※ページのデザインは異なる場合があります。)

保存した圧縮ファイル「ttp〜」(.lzh)ファイルを展開(解凍)します。

Windowsロゴのキーを押しながら「R」キーを押し、「cmd」と半角で打ち込んでEnterキーを押すと、コマンドプロンプトが起動しますので、そのウィンドウをそのまま開いて置いておきます
(TaskTrayPlusにウィンドウを認識させる為です。)

TskTrayP」(.exe)ファイルを実行します。
画像

起動すると、デスクトップ右下のタスクトレイにアイコンが表示されます。
画像

表示されない場合は、矢印的なマークをクリックして隠されたアイコンを確認します。
画像

TaskTrayPlusのアイコンを右クリックし、「設定」をクリックします。
画像

動作設定」タブで、「ターゲット・ウィンドウ アイコンを表示」にチェックを入れます。
画像

現在のタスク」の欄内で、バッチファイル(コマンドプロンプト)のウィンドウをクリックして選択し、「↓追加」をクリックし、「OK」をクリックします。
画像

デスクトップ右下のタスクトレイ内に、バッチファイルのアイコンが表示されます。
画像

表示されない場合は、矢印的なマークをクリックして隠されたアイコンを確認します。
画像

そのアイコンをダブルクリックすると、ウィンドウが表示されます。

TaskTrayPlusで最小化したバッチファイルのアイコンを変更する

TaskTrayPlusで最小化したバッチファイルのアイコンを変更する方法です。

アイコンを変更したいバッチファイルを右クリックしたまま
デスクトップやフォルダの余白部分に持って行き、
右クリックを放し
出たメニューから「ショートカットをここに作成」をクリックします。
画像

以下のようにショートカットが作成されます。
画像

作成されたショートカットを右クリックし、「プロパティ」をクリックします。
画像

アイコンの変更」をクリックします。
画像

利用できるアイコンがありません」という旨の警告が出た場合は、「OK」をクリックします。
画像

参照」をクリックしてアイコンファイルを選択するか、
中央にある欄内からアイコンを選び、「OK」をクリックします。
画像

OK」をクリックします。
画像

後は、上記のショートカットを実行すると、アイコンが変更されたバッチファイルが起動します。

バッチファイルでやりたい事を実現する

バッチファイルで何かを実現したい場合は、やりたい事 + 「バッチファイル」や「コマンド」や「コマンドプロンプト」等のワードでWEB検索してみてください。

例えば、手持ちの動画をMP4ファイルに変換したい場合は、「MP4 変換 バッチファイル」や「MP4 変換 コマンド」等でWEB検索してみてください。