1. ホーム
  2. スクリプト・コラム
  3. DOS/BAT

DOSバッチ処理上級編 第3章 FORコマンドの変数

2022-01-25 04:48:12

FORコマンドには、初心者の方には使い方がよくわからない変数がいくつかありますので、今日はその使い方を説明します!

まず、FORの変数をすべてリストアップしてみましょう。

     ~I - 引用符 (") をすべて削除し、%I を展開します。
     %~fI - %I を完全修飾パス名に拡張します。
     %~dI - %I をドライブ文字だけに拡張します。
     %~pI - %I をパスだけに拡張します。
     %~nI - %I をファイル名のみに拡張します。
     %~xI - %I をファイル拡張子のみに拡張します。
     %~sI - 短い名前だけを含むパスを拡張します。
     %~aI - %I をファイルのファイル属性に拡張します。
     %~tI - %I をファイルの日付/時刻に拡張します。
     %~zI - %I をファイルのサイズに拡張します。
     %~$PATH:I - path 環境変数にリストされているディレクトリを検索し、%I を最初に見つかった完全修飾名に展開します。環境変数名が定義されていない場合、またはファイルが見つからない場合、このキーの組み合わせは、空の文字列に展開されます。


各行に大文字のquot;I"があるのがわかりますが、このIは実はFORに持ってくる変数で、FOR文に代入する変数名はすべてここに書かれています。

例えば FOR /F %%z IN ('set') DO @echo %%z

ここでは、変数名zを代入し、そのIをzに変更する、例えば、%~fIを%~fzに変更する

前の%~pは、このような構文です。

では、さっそく始めましょう。

I. ~I - 引用符(")を削除し、%Iを展開します。

この変数は、彼が言うように、引用符を削除します!
この例を見てみましょう。
まず、次のような内容の一時ファイルtemp.txtを作成します。
1111
"2222"。
3333"
4444"44
"55"55"55

BATファイルは、以下のコードで作成することができます。

@echo off
echo ^"1111>temp.txt
echo "2222">>temp.txt
echo 3333^">>temp.txt
echo "4444"44>>temp.txt
echo ^"55"55"55>>temp.txt

rem above to create a temporary file, note that the unpaired quotation marks should be added to the escape character ^, do not leave spaces before the redirect symbol

FOR /F "delims=" %%i IN (temp.txt) DO echo %%~i
pause
del temp.txt


実行後、CMDが次のように返ってくるのがわかります。
          文字列#の前の引用符は削除されます
          文字列の先頭と末尾の#quotesが削除されます
3333" #文字列の前の引用符はなく、後の引用符は保持される
4444"44 #文字列の前の引用符は削除され、中間の引用符は維持される
55"55"55 #文字列の前の引用符は削除され、中間の引用符は維持される
続行するにはいずれかのキーを押してください . . .

temp.txtの前の内容と比較してみてください。1、2、5行目の引用符が消えているのがわかりますが、これは引用符~iを削除した結果です
引用符の削除のルールは以下の通りです(BAT兄さん追加!)。
1. 文字列の最初と最後の両方に引用符が存在する場合、最初と最後の引用符を削除します。
2. 引用符が文字列の末尾に存在しない場合、文字列の先頭の引用符を削除します。
3. 引用符が文字列の途中、または末尾にのみ存在する場合、それらは削除されません。

II. %~fI - %I を完全修飾パス名に拡張する。

例をご覧ください。
コードは好きなところに保存してください。私はデスクトップに置いておきます。

FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~fi
pause

実行すると、以下のように表示されます。
test.bat
test.vbs

比較すると、パスがないことは簡単にわかりますが、これは "Iを完全修飾パス名に拡張した効果です" つまり、%i変数の内容がファイル名であれば、ファイル名だけでなく、そのファイルがある絶対パスを出力してくれます、自分の手で実験して確かめてみて下さいね!

III. %~dI - %I をドライブ番号のみに拡張する

例をご覧ください。
コードは以下の通りですが、やはりデスクトップに置いて実行することにしました

FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~di
pause

実行後、私のCMDは次のように表示されます。
C:
C:
私のデスクトップは、2つのファイルtest.bat、test.vbs、%%~diは変数%%iの内容がファイルまたはディレクトリ名であれば、彼は彼にファイルを置くということです。
またはディレクトリがプリントアウトされたディスクシンボルに位置しています!

IV. %~pI - %I をパスだけに拡張する。

これは上記と同じで、パスだけを表示し、ファイル名は表示しません。

FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~pi
pause

私は結果を入力しません、あなたは結果を見るためにコードをコピーすることができ、次のいくつかは、そのような使用であり、コードが配られ、あなたは自分自身で結果を見ることができます!私は、あなたがそれを行うことができます。

V. V. %~nI - %I をファイル名だけに拡張する

ファイル名のみを表示する

FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ni
pause

VI. xI - %Iをファイル拡張子のみに拡張する

ファイル拡張子のみを表示する

FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~xi
pause

VII. %~sI - 短い名前だけを含む拡張パス

短いファイル名の絶対値を表示する

FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~si
pause

VIIIです。%~aI - ファイルに%Iを拡張するファイル属性

ファイルの属性を表示する

FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ai
pause

IX. %~tI - %I をファイルの日付/時刻に拡張します。

ファイルが作成された日付を表示する

FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ti
pause

x. %~zI - %I をファイルのサイズに拡張します。

ファイルサイズを表示する

FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~zi
pause

上記の例の "delims==" は "delims=" に、つまりセパレータなしで変更することが可能です。

XIです。%~$PATH:I - path 環境変数にリストされているディレクトリを検索し、最初に見つかった完全修飾名まで %I を拡張します。環境変数名が定義されていない場合、またはファイルが見つからない場合、このキーの組み合わせは空の文字列に展開されます。

これが最後なんですが、上の全部と違うので、別にお話しますよ~。

そして、コードを一括保存して、デスクトップに置いてください。

@echo off
FOR /F "delims=" %%i IN ("notepad.exe") DO echo %%~$PATH:i
pause

Tornado added: The above code shows the result as C:\WINDOWS SYSTEM32 NOTEPAD.exe.

PATH変数で指定されたパスの中からnotepad.exeファイルを探し、notepad.exeがあればその絶対パスが出力され、なければエラーが出力されるという意味だそうです
さて、FOR変数については以上です。