コマンドプロンプトの覚書
Contents
if 文の条件分岐
https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/if
既にファイル、フォルダがある場合の処理
if exist “ファイルパス、フォルダパス” [処理]
括弧とか要らない。
処理が複数ある場合は、ラベルを使って分岐するパターンが多いと思う。
if exist "D:\Program Files\***\x86e_win64" set machine=x86e_win64
if exist "D:\Program Files\***\i486_nt" set machine=i486_nt
サービスの操作
NET stop サービス名
>net /?
このコマンドの構文は次のとおりです:
NET
[ ACCOUNTS | COMPUTER | CONFIG | CONTINUE | FILE | GROUP | HELP |
HELPMSG | LOCALGROUP | PAUSE | SESSION | SHARE | START |
STATISTICS | STOP | TIME | USE | USER | VIEW ]
パラメータを定義する。
set [parameter_name] = [parameters_value]
「=」の前後にスペースを入れない。
「”」で値を挟むと「”」自体が文字列として代入されてしまう。
※コマンドプロンプト実行中のみ有効。
SET での定義は、コマンドプロンプトプロンプトを閉じるまで有効なので、
バッチ処理以外でも使用すると便利な場面があると思う。
set TEST_ARG=Hellow World
echo %TEST_ARG%
環境変数や、SET で定義した変数は「%」で挟んで呼び出す。
echo %PATH%
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\dotnet\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Users\s-shiraki\AppData\Local\Microsoft\WindowsApps;
引数的なものは「%」をつける。バッチで使う場合は「%%」をつける。
日時の取得
echo %date%-%time%
2022/10/07-16:45:34.01
文字列操作
「変数:(コロン)文字列A=文字列B」で変数内の文字列Aを文字列Bに置換する。
例:
set test=ababab
echo %test%
→ababab
echo %test:a=c%
→cbcbcb
文字列指定ではなく、「~n」をつけると文字列の位置を指定。
変数「test」の値の3文字目から3文字分抜き出す。
マイナスは後ろから。
set test=0123456789
echo %test:~3,3%
→345
DATE関数から「今日8※」値を取得する。
※今日の西暦、月、日付で作った8桁の数字
echo %date:/=%
→20230216
(スラッシュを空白に置き換えてます。)
TIME関数からも似たようなことをしてみる。
set t=%time::=%
set t=%t:.=%
echo %t%
→13274471
(コロンとピリオドを消す)
入力した文字を変数に入れる
set /p input-data="input-->input-data:"
@echo input-data=%input-data%
>set /p input-data="input-->input-data:"
input-->input-data:input keyboard
input-data=input keyboard
参考
%CD% - 現在のディレクトリ文字列に展開します。
%DATE% - DATE コマンドと同じフォーマットで現在の日付に展開します。
%TIME% - TIME コマンドと同じフォーマットで現在の時刻に展開します。
%RANDOM% - 0 から 32767 の間の任意の 10 進数に展開します。
%ERRORLEVEL% - 現在の ERRORLEVEL の値に展開します。
%CMDEXTVERSION% - 現在のコマンド プロセッサ拡張機能のバージョン番号に
展開します。
%CMDCMDLINE% - コマンド プロセッサを起動したオリジナル コマンド ライン
に展開します。
%HIGHESTNUMANODENUMBER%
- このコンピューター上の最大の NUMA ノード番号に展開します。
FOR
基本的な構文。
for %i in (*) DO echo %i
処理が複雑なら、PowerShell の方がいいかも。
>FOR /F "tokens=1,2,3 delims=/" %i in ('echo %date%') do @echo 1=%i 2=%j 3=%k
1=2022 2=10 3=07
/F オプションで分解方法を指定しないと、ファイル解析にならない。
tokens= で分解した何番目を変数としてFOR に渡すか指定している。
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
この例は、myfile.txt の各行を解析します。セミコロンで始まる行を無視し、
各行の 2 番目と 3 番目のトークンを for 本体に渡します。
トークンは、コンマまたはスペースで区切られています。
for 本体の文が %i で 2 番目のトークンを、%j で 3 番目のトークンを取得し、
%k で 3 番目以降のすべてのトークンを取得していることに
注意してください。
スペースを含むファイル名に対しては、二重引用符でファイル名を引用する
必要があります。
この方法で二重引用符を使うためには、usebackq オプションも
使わなければなりません。
使わなければ、二重引用符はリテラル文字列の定義として
解釈され、解析されます。
>for /?
指定されたコマンドをファイル セットの各ファイルに対して実行します。
FOR %変数 IN (セット) DO コマンド [コマンドパラメーター]
%変数 単一文字の置き換え可能なパラメーターを指定します。
(セット) ファイル セットを指定します。ワイルドカードを使用できます。
コマンド 各ファイルごとに実行するコマンドを指定します。
コマンドパラメーター
指定されたコマンドのパラメーターまたはスイッチを指定します。
バッチ プログラムで FOR コマンドを使用するときは、%変数の代わりに、
%%変数を使用してください。変数名では大文字と小文字が区別されるため、
%i と %I は異なります。
コマンド拡張機能を有効にすると、次の FOR コマンドの追加形式
がサポートされるようになります:
FOR /D %変数 IN (セット) DO コマンド [コマンド パラメーター]
セットがワイルドカードを含む場合は、ファイル名ではなくディレクトリ名
の一致を指定します。
FOR /R [[ドライブ:]パス] %変数 IN (セット) DO コマンド [コマンド パラメーター]
[ドライブ:]パスから始めて、ツリーの各ディレクトリで FOR 文を実行し
ます。/R の後にディレクトリが指定されていない場合は、現在の
ディレクトリが使用されます。セットが単一のピリオド (.) である場合は、
ディレクトリ ツリーの列挙だけを行います。
FOR /L %変数 IN (開始,ステップ,終了) DO コマンド [コマンド パラメーター]
セットは、ステップの量ごとに変化する開始から終了までの数列です。
たとえば、(1,1,5) は 1 2 3 4 5、(5,-1,1) は (5 4 3 2 1) という数列に
なります。
FOR /F ["オプション"] %変数 IN (ファイル セット) DO コマンド
[コマンド パラメーター]
FOR /F ["オプション"] %変数 IN ("文字列") DO コマンド [コマンド パラメーター]
FOR /F ["オプション"] %変数 IN ('コマンド') DO コマンド [コマンド パラメーター]
または usebackq オプションの場合:
FOR /F ["オプション"] %変数 IN (ファイル セット) DO コマンド
[コマンド パラメーター]
FOR /F ["オプション"] %変数 IN ('文字列') DO コマンド [コマンド パラメーター]
FOR /F ["オプション"] %変数 IN (`コマンド`) DO コマンド [コマンド パラメーター]
ファイル セットは、1 つ以上のファイル名です。各ファイルが開かれ、
読み取られ、処理されてから、ファイル セットの次のファイルに進みます。
処理では、ファイルの読み取り、個々のテキスト行への分割と、0 個以上の
トークンへの解析が行われます。その後、見つかったトークン文字列を変数値に
設定して for ループの本体が呼び出されます。既定では、/F は、各ファイルの
各行から、空白で区切られた最初のトークンを取得して渡します。空白行は
スキップされます。既定の解析動作を変更するには、省略可能な "オプション"
パラメーターを指定します。これは、異なる解析オプションを指定する 1 つ以上の
キーワードを含む、引用符で囲まれた文字列です。キーワードは、次のとおりです:
eol=c - 行末のコメント文字を指定します (1 文字)。
skip=n - ファイルの先頭でスキップする行数を指定します。
delims=xxx - 区切り文字のセットを指定します。
これは、既定の区切り文字であるスペースとタブを
置き換えます。
tokens=x,y,m-n - 各繰り返しに対して、各行から for 本体に渡す
トークンを指定します。これにより、追加の変数名が
割り当てられます。
m-n の形式は範囲で、m 番目から n 番目の
トークンを指定します。
tokens= 文字列の最後の文字がアスタリスクである場合は、
追加の変数が割り当てられ、最後のトークンが解析された
後、行に含まれている残りのテキストを受け取ります。
usebackq - 次の新しい表示形式を指定します。
逆引用符で囲まれた文字列がコマンドとして実行され、
一重引用符で囲まれた文字列がリテラル文字列コマンドに
なり、ファイル セットのファイル名を二重引用符で
囲めるようになります。
例を参考にしてください:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
この例は、myfile.txt の各行を解析します。セミコロンで始まる行を無視し、
各行の 2 番目と 3 番目のトークンを for 本体に渡します。
トークンは、コンマまたはスペースで区切られています。
for 本体の文が %i で 2 番目のトークンを、%j で 3 番目のトークンを取得し、
%k で 3 番目以降のすべてのトークンを取得していることに
注意してください。
スペースを含むファイル名に対しては、二重引用符でファイル名を引用する
必要があります。
この方法で二重引用符を使うためには、usebackq オプションも
使わなければなりません。
使わなければ、二重引用符はリテラル文字列の定義として
解釈され、解析されます。
%i は for 文で明示的に宣言され、%j と %k は tokens= オプションで暗黙的に
宣言されています。
tokens= 行を使って 26 個までのトークンを指定できますが、
文字 'z' または 'Z' よりも高い変数を宣言することはできません。FOR 変数名は
単一の文字で、大文字と小文字を区別し、グローバルなものであり、一度に
アクティブにできるのは合計 52 個までです。
また、かっこで囲んだファイル セットを一重引用符で囲み、文字列にすることに
より、即時の文字列に対する FOR /F 解析ロジックを使うこともできます。
これは、ファイルからの単一入力行として処理されます。
最後に、FOR /F コマンドを使って、コマンド出力を解析することができます。
かっこの中のファイル セットを逆引用符で囲みます。この文字列は、コマンド
ラインとして子 CMD.EXE に渡されます。出力はメモリにキャプチャされ、
ファイルのように解析されます。
例:
FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
この例は、現在の環境の環境変数名を列挙します。
また、FOR 変数参照の置換も拡張されました。
次のオプション構文を使うことができます:
%~I - すべての引用句 (") を削除して、%I を展開します。
%~fI - %I を完全修飾パス名に展開します。
%~dI - %I をドライブ文字だけに展開します。
%~pI - %I をパス名だけに展開します。
%~nI - %I をファイル名だけに展開します。
%~xI - %I をファイル拡張子だけに展開します。
%~sI - 展開されたパスは短い名前だけを含みます。
%~aI - %I をファイルの属性に展開します。
%~tI - %I ファイルの日付/時刻に展開します。
%~zI - %I ファイルのサイズに展開します。
%~$PATH:I - PATH 環境変数に指定されているディレクトリを
検索し、最初に見つかった完全修飾名に %I を
展開します。
環境変数名が定義されていない場合、または検索
してもファイルが見つからなかった場合は、この
修飾子を指定すると空の文字列に展開されます。
修飾子を組み合わせて、複合結果を得ることもできます:
%~dpI - %I をドライブ文字とパスだけに展開します。
%~nxI - %I をファイル名と拡張子だけに展開します。
%~fsI - %I を完全なパスと短い名前だけに展開します。
%~dp$PATH:I - PATH 環境変数に指定されているディレクトリを
検索して %I を探し、最初に見つかったファイル
のドライブ文字とパスだけに展開します。
%~ftzaI - %I を DIR コマンドの出力行のように展開します。
上の例の %I と PATH は、他の有効な値で置き換えることができます。
%~ 構文は、有効な FOR 変数名によって区切られます。%I のような大
文字の変数を使うと読み取りやすく、大文字と小文字を区別しない修飾子
との混乱を避けることができます。
(Visited 24 times, 1 visits today)