山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他概要
          このページは、Windowsのバッチファイルの変数について記述します。 使える変数は3種類がある。
          
            
        
        | 種類 | 記述方法 | 概要 | 
|---|---|---|
| バッチファイルの引数 | 各引数は%0~%9 全引数は%* | 読み取り専用 9個以上の引数を扱う場合はshift文でずらして使用する | 
| 環境変数 | %変数名% | あらかじめシステムで登録されているもの他、自分で定義可能 | 
| for文の変数 | コマンドプロンプトでは%変数名 バッチファイルでは%%変数名 | 変数名は英字1文字のみでなければならない | 
環境変数内の文字列の部分取得
rem 01234567890123456 rem 65432109876543210 set test=01234567890ABCDEF上記の様に環境変数testを設定した場合の部分取得例を以下に示します。
| 書式 | 記述例 取得結果 | 
|---|---|
| %変数名:~先頭からの開始位置% | %test:~3% 34567890ABCDEF | 
| %変数名:~先頭からの開始位置,文字数% | %test:~3,2% 34 | 
| %変数名:~先頭からの開始位置,-末尾からの文字位置% | %test:~3,-4% 34567890AB | 
| %変数名:~-末尾からの開始位置% | %test:~-5,2% BC | 
| %変数名:~-末尾からの開始位置,-末尾からの文字位置% | %test:~-5,-1% BCDE | 
環境変数内の文字の置き換え
          環境変数の文字を置き換えるには以下の様に記述します。
%環境変数:A=B%
例えば以下のバッチファイルを実行すると環境変数tempのCがcに置換される
d:¥bat¥mod¥rep.bat
        %環境変数:A=B%
例えば以下のバッチファイルを実行すると環境変数tempのCがcに置換される
d:¥bat¥mod¥rep.bat
set test=ABCDEFG echo %test:C=c% pause実行結果
D:¥bat¥mod>set test=ABCDEFG D:¥bat¥mod>echo ABcDEFG ABcDEFG D:¥bat¥mod>pause 続行するには何かキーを押してください . . .
環境変数の修飾子
          引数およびfor文の変数に対して修飾子をつけることができます。
          
%~fn
例えば以下のバッチファイルを実行するとfullpass.batのフルパス名が表示される
d:¥bat¥mod¥fullpass.bat
%~pn
例えば以下のバッチファイルを実行するとpass.batのパスだけが表示される
d:¥bat¥mod¥pass.bat
%~dn
例えば以下のバッチファイルを実行するとdrive.batのドライブ文字が表示される
d:¥bat¥mod¥drive.bat
%~ni
例えば以下のバッチファイルを実行するとfile.batのファイル名が表示される
d:¥bat¥mod¥file.bat
%~pn
例えば以下のバッチファイルを実行するとext.batの拡張子が表示される
d:¥bat¥mod¥ext.bat
※nは変数の番号を示す
            
          修飾子は複数を同時に指定できる。
例えば%dpnと指定するとドライブ名とパス名であるD:¥bat¥mod¥に変換される。
        フルパスに展開
環境変数をフルパス名に変換するには(変数番号がnの時)以下の様に記述します。%~fn
例えば以下のバッチファイルを実行するとfullpass.batのフルパス名が表示される
d:¥bat¥mod¥fullpass.bat
echo %~f0 pause実行結果
D:¥bat¥mod>echo D:¥bat¥mod¥fullpass.bat D:¥bat¥mod¥fullpass.bat D:¥bat¥mod>pause 続行するには何かキーを押してください . . .
パスだけに展開
環境変数をパスだけに変換するには(変数番号がnの時)以下の様に記述します。%~pn
例えば以下のバッチファイルを実行するとpass.batのパスだけが表示される
d:¥bat¥mod¥pass.bat
echo %~p0 pause実行結果
D:¥bat¥mod>echo ¥bat¥mod¥ ¥bat¥mod¥ D:¥bat¥mod>pause 続行するには何かキーを押してください . . .
ドライブ文字に展開
環境変数をドライブ文字に変換するには(変数番号がnの時)以下の様に記述します。%~dn
例えば以下のバッチファイルを実行するとdrive.batのドライブ文字が表示される
d:¥bat¥mod¥drive.bat
echo %~d0 pause実行結果
D:¥bat¥mod>echo D: D: D:¥bat¥mod>pause 続行するには何かキーを押してください . . .
ファイル名に展開
環境変数をファイル名に変換するには(変数番号がiの時)以下の様に記述します。%~ni
例えば以下のバッチファイルを実行するとfile.batのファイル名が表示される
d:¥bat¥mod¥file.bat
echo %~n0 pause実行結果
D:¥bat¥mod>echo file file D:¥bat¥mod>pause 続行するには何かキーを押してください . . .
拡張子に展開
環境変数を拡張子に変換するには(変数番号がnの時)以下の様に記述します。%~pn
例えば以下のバッチファイルを実行するとext.batの拡張子が表示される
d:¥bat¥mod¥ext.bat
echo %~x0 pause実行結果
D:¥bat¥mod>echo .bat .bat D:¥bat¥mod>pause 続行するには何かキーを押してください . . .
その他
変数%nには"D:¥bat¥mod¥all.bat"が格納されている場合の変換例を以下に示します。※nは変数の番号を示す
| 修飾子 | 変換名 | 変換例 | 
|---|---|---|
| %~n | ダブルクォーテーションを削除 | D:¥bat¥mod¥all.bat | 
| %~fn | 完全修飾パス名(フルパス) | D:¥bat¥mod¥all.bat | 
| %~dn | ドライブ文字 | D: | 
| %~pn | パス(ファイル名を除く) | ¥bat¥mod¥ | 
| %~nn | ファイル名 | all | 
| %~xn | 拡張子 | .bat | 
| %~sn | 8.3形式でフルパス | D:¥bat¥mod¥all.bat | 
| %~an | ファイル属性 | --a------ | 
| %~tn | ファイル更新時の日付/時刻。 | 2015/12/29 21:32 | 
| %~zn | ファイルサイズ | 116 | 
例えば%dpnと指定するとドライブ名とパス名であるD:¥bat¥mod¥に変換される。
変数の遅延展開
          変数の参照方法には%変数名%と!変数名!がある。
          
例えば以下様なバッチファイルを実行すると、for文の中は6回のループとなるので、変数numは1~6まで変化しそうに見せますが、実行結果の通りechoの表示結果は0のままです。
変数numの展開が読み込み時のみ展開されていますので最初に代入した0から変わりません。
例えば以下様なバッチファイルを実行すると、for文の中は6回のループとなるので、変数numは1~6まで変化します。
通常の展開と違い参照のたびに展開されますのでループのたびに1ずつ加算されます。
遅延展開を使用するために、setlocal enabledelayedexpansionを宣言しています。
また参照時には!を使用しています。
        
      通常の展開
バッチファイルの読み込み時のみ変数が展開されます。例えば以下様なバッチファイルを実行すると、for文の中は6回のループとなるので、変数numは1~6まで変化しそうに見せますが、実行結果の通りechoの表示結果は0のままです。
変数numの展開が読み込み時のみ展開されていますので最初に代入した0から変わりません。
@echo off set num=0 for %%A in (a b c d e f) do ( set /A num=%num%+1 echo %num% %%A ) pause出力結果
0 a 0 b 0 c 0 d 0 e 0 f 続行するには何かキーを押してください . . .
遅延展開
変数を参照するたびに展開されます。例えば以下様なバッチファイルを実行すると、for文の中は6回のループとなるので、変数numは1~6まで変化します。
通常の展開と違い参照のたびに展開されますのでループのたびに1ずつ加算されます。
遅延展開を使用するために、setlocal enabledelayedexpansionを宣言しています。
また参照時には!を使用しています。
@echo off setlocal enabledelayedexpansion set num=0 for %%A in (a b c d e f) do ( set /A num=!num!+1 echo !num! %%A ) pause
1 a 2 b 3 c 4 d 5 e 6 f 続行するには何かキーを押してください . . .
      Copyright (C) 2012 山本ワールド All Rights Reserved.
    
    
  