バッチファイル

ページ概要

バッチファイルのTipsについてまとめたページです。

どこからバッチを起動させても大丈夫なようにする

 pushd %~dp0
 popd
上記コマンドをバッチファイルの最初と最後に書いておけば、
バッチ実行時に、バッチファイルのあるディレクトリがカレントに設定されます。
(※%~dp0については下のバッチパラメータ・修飾子を参照してください。)

管理人が良く使うバッチファイルのテンプレ
pushd %~dp0
setlocal

rem ここに処理内容

endlocal
popd
pause

バッチパラメータ・修飾子

バッチファイルでは、バッチパラメータと呼ばれる変数を利用する事ができ、
それらを利用する事でファイルに対するバッチ処理を比較的簡単に行う事ができる。

通常は変数名の前に識別文字の「%」をつけて表される。
「!」をつけることもあるが、それはNT系のコマンドインタープリタ「cmd.exe」
でサポートしている遅延環境変数を表現する時に採用される。

「%」を使用するやり方はMS-DOSの頃からずっと続く一般的な環境変数の表記方法である。

パラメータ「%1」はバッチファイル実行時に付加された最初のパラメータを表す。
2番目は「%2」、3番目は「%3」で全部で9個のパラメータを渡す事ができる。
特別なものに「%0」があり、これは実行されたバッチファイル名を表す。

これらの変数はいずれも文字列型の変数として取り扱われるが、
下記のような修飾子をつければ簡単な編集が可能。
修飾子
機能・用途 
%~1
全ての引用句(")を削除して%1を展開する。 
%~f1  %1を完全修飾パス名に展開する。  
%~d1
%1をドライブ名だけに展開する。
%~p1  %1をパスだけに展開する。 
%~n1  %1をファイル名だけに展開する。 
%~x1  %1をファイル拡張子だけに展開する。 
%~s1  展開されたパスはMS-DOSの「8.3形式」でも短い名前だけを含む。 
%~a1  %1をファイル属性に展開する。 
%~t1  %1をファイルの日付・時刻に展開する。 
%~z1  %1をファイルのサイズに展開する。 
%~$PATH:1  PATH環境に指定されているディレクトリを検索し、最初に見つかった完全修飾名に%1を展開する。
環境変数名が定義されていない場合、また検索してもファイルが見つからなかった場合は、この修飾子を指定すると空の文字列に展開する。
 


■いくつかの修飾子を組み合わせる事も可能。
ex1) %~dp1 %1をドライブ名とパスだけに展開する

参考ページ:

ファイル名の連なった環境変数を設定する

ファイルコンバート環境などで、exeの後ろにファイル名をたくさん
指定できるコンバーターがある場合、
 converter.exe file1.bin file2.bin・・・
と指定すると思いますが、バッチファイルではこれを実現できません。
(できるかもしれません。が、自分は見つけられませんでした。。。)

ので、適当な環境変数にファイル名をどんどん追加していき、
 converter.exe %FILE%
みたいな感じで処理したいと思います。
このときの環境変数FILEの作成方法をまとめます。
 SETLOCAL ENABLEDELAYEDEXPANSION
 
 rem ファイル名の連なった環境変数を作成
 set FILE=
 for %%a in (*.*) do (
 set FILE=!FILE! %%~fa
 )
 
 SETLOCAL DISABLEDELAYEDEXPANSION
上記コマンドで同じフォルダ内にある全てのファイル名(フルパス)が入った環境変数FILEが作成されます。
遅延環境変数?みたいな機能を使うらしいです。

参考ページ:

外部呼び出しのバッチエラー終了を捕まえる

バッチファイルから別のバッチファイルを実行し、そのバッチファイルの実行エラーを
検出したい場合があります。
その場合、以下のコマンドを記述する必要があります。

■呼び出し側
 cmd /c test.bat
 if ERRORLEVEL 1 (
 echo "test.batが失敗しました。"
 pause
 )
callコマンドではなく、cmd /cコマンドを使う所がミソらしいです。

■呼び出される側
エラーになったところで
 exit /b 1
こうすると呼び出し側のERRORLEVELに1がセットされます。

.svnを削除する

subversionでチェックアウトしたフォルダには.svnフォルダが作成されます。
この.svnを消したいときは以下のコマンドを叩くとカレント以下の.svnフォルダを全て削除してくれます。
 echo off for /r %%i in ( .svn ) do ( if exist "%%i" ( rmdir /s /q "%%i")) 

参考ページ:

日付つきのディレクトリを作成する

以下のコマンドでカレントディレクトリにYYYYMMDD-HHMMSSのフォルダ名を作成します。
 set sDate=%date%
 set sTime=%time%
 set nDate=%sDate:~0,4%%sDate:~5,2%%sDate:~8,2%
 set nHour=%sTime:~0,2%
 set nMinute=%sTime:~3,2%
 set nSecond=%sTime:~6,2%
 if "%nHour:~0,1%" == " " set nHour=0%nHour:~1,2%
 set nTime=%nHour%%nMinute%%nSecond%
 set nCurrentTime=%nDate%-%nTime%
 mkdir %nCurrentTime%

64bitマシンと32bitマシンを区別する

以下のコマンドで32bitマシンか64bitマシンかを区別して処理することができます。
特に32bitマシンの"Program Files"のディレクトリが64bitマシンでは"Program Files(x86)"という
名前になるのでそこを区別した処理をするときに役立ちます。
 if "%PROCESSOR_ARCHITECTURE%" == "x86" (
     // ここに32bit用の処理を書きます
 ) else (
     // ここに64bit用の処理を書きます
 )