Help us understand the problem. What is going on with this article?

Windows バッチファイルの引数とパス名要素分解、対話入力、文字列置換まとめ

More than 1 year has passed since last update.

今更ながら Windows のバッチファイル引数と変数についてまとめました。

バッチファイルの拡張子

引数の説明に入る前に、バッチファイルの拡張子について。
Windowsではバッチファイル用に次の2つの拡張子が用意されています。

  • .BAT --- MS-DOS 時代からの伝統的な拡張子
  • .CMD --- WindowsNT 系で使える拡張子

MS-DOSやMS-DOSから起動するWindows95/98/Me上では、後者の.CMD拡張子はバッチファイルとして実行できないので、MS-DOS環境でも実行したいバッチ処理は.BATを、NT環境専用のバッチ処理は.CMDをつけて使い分けます。
ただし、現時点(2016年)においてはMS-DOSやWindows95系は退役しているので、もはや意味のない使い分けになりました。好きなほうの拡張子を使えば良いです。あるいは、一時的な作業バッチと恒久的な作業バッチで拡張子を使い分ける運用をしても良いでしょう。
例: *.CMDを一時作業用に割り当て、作業終了時に del *.CMD で用済みファイルを片付ける。

コマンドライン引数

バッチファイルを次のように呼び出した場合

C> バッチファイル名 引数1 引数2 引数3

3つの引数はバッチファイル内で %1 %2 %3 として参照できます。%* なら3つまとめて参照できます。
SHIFT [/n] によりn番目以後の引数番号をずらせます。

argtest.bat
@echo off
echo arg1: %1
echo arg2: %2
echo arg3: %3
echo arg*: %*
shift
echo arg1: %1
echo arg2: %2
echo arg3: %3
echo arg*: %*
実行例.
C>argtest A B C
arg1: A
arg2: B
arg3: C
arg*: A B C
arg1: B
arg2: C
arg3:
arg*: A B C

引数をパス名として分解、加工する

引数の引用符を外したり、さらにファイル名としてフルパス展開やドライブ名や拡張子の各要素に分解したり、属性や更新時刻やファイルサイズに置換できます。詳しくは help for で調べてください。

argtest.bat
@echo off
echo arg1: %1
echo arg~1: %~1
echo arg~f1: %~f1
echo arg~d1: %~d1
echo arg~p1: %~p1
echo arg~n1: %~n1
echo arg~x1: %~x1
echo arg~a1: %~a1
echo arg~t1: %~t1
echo arg~z1: %~z1
実行例.
C>argtest "argtest.bat"
arg1: "argtest.bat"
arg~1: argtest.bat
arg~f1: C:\Users\hkuno\mybin\argtest.bat
arg~d1: C:
arg~p1: \Users\hkuno\mybin\
arg~n1: argtest
arg~x1: .bat
arg~a1: --a--------
arg~t1: 2016/12/09 10:44
arg~z1: 260

対話入力

コマンドライン引数ではなく、バッチファイル実行中に対話入力したい場合は SET /P 環境変数=[プロンプト文字列] でユーザ入力を環境変数に設定できます。

バッチファイル.
set /p ANS="input string:"
echo ANS: %ANS%
実行例.
input string:hello
ANS: hello

文字列置換

引数を環境変数に代入すれば、文字列置換を行うことができます。

バッチファイル.
set /p ANS="input date:"
echo ANS               : %ANS%
echo replace / to _ ANS: %ANS:/=_%
実行例.
input date:2016/12/9
ANS               : 2016/12/9
replace / to _ ANS: 2016_12_9

組み込み環境変数

バッチファイル内で参照できる組み込み環境変数にて、カレントディレクトリ名や日付時刻などが参照できます。
詳しくは help set で調べてください。

SETのHELP出力から抜粋.
%CD%            - 現在のディレクトリ文字列に展開します。

%DATE%          - DATE コマンドと同じフォーマットで現在の日付に展開します。

%TIME%          - TIME コマンドと同じフォーマットで現在の時刻に展開します。

%RANDOM%        - 0 から 32767 の間の任意の 10 進数に展開します。

%ERRORLEVEL%    - 現在の ERRORLEVEL の値に展開します。

%CMDEXTVERSION% - 現在のコマンド プロセッサ拡張機能のバージョン番号に
                    展開します。

%CMDCMDLINE%    - コマンド プロセッサを起動したオリジナル コマンド ライン
                    に展開します。

%HIGHESTNUMANODENUMBER%
                  - このコンピューター上の最大の NUMA ノード番号に展開します。

参照

Windowsのコマンドプロンプトから下記を実行する。

help set
help for
help if
help shift
help cmd

バッチファイルの引数や変数についての有用情報が各コマンドのhelpに分散しているので、気付いたものを随時このページにまとめていく。

hkuno
ソフトウェア設計開発者。C/C++をメインにC#, Perl, JavaScript,lua,golangを少々。 最近は、Raspberry Pi で面白いモノを作りたいと思っています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした