MS-DOSコマンドプロンプトTips

MS-DOS コマンドプロンプトとバッチファイルに関するTips。 ここで紹介するものはWindows XPにて検証したもの(他のOSでは未検証)。

環境変数

  • 値を代入するときは、「set 変数名=値」
  • 値を参照するときは、「%変数名%」
  • 値の一部分を取得するときは、「%変数:~開始位置,長さ%」

echo

echoの使い方。

echo on/off

echo on(デフォルト)の場合は、バッチファイルのコマンドがそのまま表示される。 echo offの場合は、コマンドは表示されず、結果のみが表示される。

echo 処理を始めます
echo echoを用いてメッセージを表示する
echo 処理を始めます
echo echoを用いてメッセージを表示する
実行結果
C:\Documents and Settings\smdn\デスクトップ>echo 処理を始めます
処理を始めます

C:\Documents and Settings\smdn\デスクトップ>echo echoを用いてメッセージを
表示する

echo offにすると、バッチファイルで実行するコマンドの部分が表示されなくなる。

echo off
echo 処理を始めます
echo echoを用いてメッセージを表示する
echo off
echo 処理を始めます
echo echoを用いてメッセージを表示する
実行結果
C:\Documents and Settings\smdn\デスクトップ>echo off
処理を始めます
echoを用いてメッセージを表示する

さらに、「@echo off」とすると、「echo off」を実行するときのコマンドも表示されなくなる。

@echo off
echo 処理を始めます
echo echoを用いてメッセージを表示する
@echo off
echo 処理を始めます
echo echoを用いてメッセージを表示する
実行結果
処理を始めます
echoを用いてメッセージを表示する

メッセージを表示する

echoに続く文字列はそのまま表示される。 環境変数は値が展開されて表示される。 「echo.」とすると空行が表示される。

echo 処理を始めます
echo 今日の日付は%DATE%です
echo.
echo OSは%OS%です
echo 処理を始めます
echo 今日の日付は%DATE%です
echo.
echo OSは%OS%です
実行結果
処理を始めます
今日の日付は2007/05/19です

OSはWindows_NTです

set

setの使い方。

すべての環境変数を表示する

setコマンドをオプション無しで実行すると、現在定義されているすべての環境変数が表示される。

C:\>set
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\smdn\Application Data
CLIENTNAME=Console
CommonProgramFiles=C:\Program Files\Common Files
COMPUTERNAME=HIKARI
ComSpec=C:\WINDOWS\system32\cmd.exe
FP_NO_HOST_CHECK=NO
HOMEDRIVE=C:
HOMEPATH=\Documents and Settings\smdn
LOGONSERVER=\\HIKARI
NUMBER_OF_PROCESSORS=1
OS=Windows_NT
Path=C:\PROGRA~1\JUSTSY~1\JSLIB32;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\Syst
em32\Wbem
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 6 Model 15 Stepping 8, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=0f08
ProgramFiles=C:\Program Files
PROMPT=$P$G
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\WINDOWS
TEMP=C:\DOCUME~1\SANTAM~1\LOCALS~1\Temp
TMP=C:\DOCUME~1\SANTAM~1\LOCALS~1\Temp
USERDOMAIN=HIKARI
USERNAME=smdn
USERPROFILE=C:\Documents and Settings\smdn
VS80COMNTOOLS=C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\
windir=C:\WINDOWS

環境変数を設定する

set LOGFILE=sample.log
set LOGDIR=.\logs\
echo %LOGDIR%%LOGFILE%
set LOGFILE=sample.log
set LOGDIR=.\logs\
echo %LOGDIR%%LOGFILE%
実行結果
.\logs\sample.log

キーボードからの入力を環境変数に代入する

/pオプションを指定してsetコマンドを実行すると、キーボードからの入力を環境変数に代入することが出来る。

echo ログファイル名は?
set /p LOGFILE=
set LOGDIR=.\logs\

echo %LOGDIR%%LOGFILE%
echo ログファイル名は?
set /p LOGFILE=
set LOGDIR=.\logs\

echo %LOGDIR%%LOGFILE%
実行結果
ログファイル名は?
test.log
.\logs\test.log

また、次の例のようにプロンプト文字列を指定することも出来る。

set /p LOGFILE=ログファイル名は? 
set LOGDIR=.\logs\

echo %LOGDIR%%LOGFILE%
set /p LOGFILE=ログファイル名は? 
set LOGDIR=.\logs\

echo %LOGDIR%%LOGFILE%
実行結果
ログファイル名は? test.log
.\logs\test.log

四則演算等の演算を行う

/aオプションを指定してsetコマンドを実行すると、四則演算等の演算を行うことが出来る。

set A=12
set B=8

set /a RESULT=%A% + %B%
echo %A% + %B% = %RESULT%

set /a RESULT=%A% - %B%
echo %A% - %B% = %RESULT%

set /a RESULT=%A% * %B%
echo %A% * %B% = %RESULT%

set /a RESULT=%A% / %B%
echo %A% / %B% = %RESULT%

set /a RESULT=%A% %% %B%
echo %A% %% %B% = %RESULT%
set A=12
set B=8

set /a RESULT=%A% + %B%
echo %A% + %B% = %RESULT%

set /a RESULT=%A% - %B%
echo %A% - %B% = %RESULT%

set /a RESULT=%A% * %B%
echo %A% * %B% = %RESULT%

set /a RESULT=%A% / %B%
echo %A% / %B% = %RESULT%

set /a RESULT=%A% %% %B%
echo %A% %% %B% = %RESULT%
実行結果
12 + 8 = 20
12 - 8 = 4
12 * 8 = 96
12 / 8 = 1
12 % 8 = 4

+=演算子や-=演算子などの複合代入演算も行うことが出来る。 なお、インクリメント・デクリメント演算子は無いので、代わりに += もしくは -= を使う必要がある。

set X=3
echo %X%

set /a X+=1
echo %X%

set /a X-=1
echo %X%

set /a X*=2
echo %X%

set /a X/=3
echo %X%
set X=3
echo %X%

set /a X+=1
echo %X%

set /a X-=1
echo %X%

set /a X*=2
echo %X%

set /a X/=3
echo %X%
実行結果
3
4
3
6
2

文字列操作

連結

2つの変数を並べることで、文字列の連結を行うことが出来る(連結するための結合演算子は無い)。

文字列の連結
set STR1=foo
set STR2=bar

set STR3=%STR1%%STR2%
echo %STR3%

set STR4=%STR3%baz
echo %STR4%
set STR1=foo
set STR2=bar

set STR3=%STR1%%STR2%
echo %STR3%

set STR4=%STR3%baz
echo %STR4%
実行結果
foobar
foobarbaz

部分文字列の取得

「%変数:~開始位置,長さ%」とすることで変数の内容から部分文字列を取得できる。 長さを省略したり、負の値を指定することも出来る。 開始位置に負の値を指定すると末尾n文字目からの部分文字列、長さに負の値を指定すると末尾n文字目までの部分文字列を取得出来る。 なお文字の番号は0から始まるため、先頭の文字は0番目となる。

書式と得られる結果をまとめると次のようになる。

書式と得られる部分文字列の例 (STR=0123456789)
書式 得られる部分文字列 (赤字部分)
%STR:~0% 0123456789
%STR:~0,3% 0123456789
%STR:~3% 0123456789
%STR:~3,5% 0123456789
%STR:~3,-5% 0123456789
%STR:~-5% 0123456789
%STR:~-5,2% 0123456789
%STR:~-5,-2% 0123456789
部分文字列の取得
set STR=0123456789

echo %STR:~0%
echo %STR:~0,3%
echo %STR:~3%
echo %STR:~3,5%
echo %STR:~3,-5%
echo %STR:~-5%
echo %STR:~-5,2%
echo %STR:~-5,-2%
set STR=0123456789

echo %STR:~0%
echo %STR:~0,3%
echo %STR:~3%
echo %STR:~3,5%
echo %STR:~3,-5%
echo %STR:~-5%
echo %STR:~-5,2%
echo %STR:~-5,-2%
実行結果
0123456789
012
3456789
34567
34
56789
56
567

置換

「%変数:置換前の文字列=置換後の文字列%」とすることで変数の一部分を置換した結果を得ることが出来る。 最初に一致した箇所でなく、一致する箇所全てが置換される。 置換後の文字列を省略すると空の文字列に置換されることとなり、部分文字列を削除することが出来る。

置換
set A=hogehogehoge
echo %A% : %A:o=a%

set B=test.log
echo %B% : %B:.log=.log.1%

set C=test.log.bak
echo %C% : %C:.bak=%
set A=hogehogehoge
echo %A% : %A:o=a%

set B=test.log
echo %B% : %B:.log=.log.1%

set C=test.log.bak
echo %C% : %C:.bak=%
実行結果
hogehogehoge : hagehagehage
test.log : test.log.1
test.log.bak : test.log

キー入力があるまで処理を中断する

pauseを用いると、その部分で処理を中断し、キー入力があるまで待機する。

echo 処理を始めます
pause
echo 完了しました
echo 処理を始めます
pause
echo 完了しました
実行結果
処理を始めます
続行するには何かキーを押してください . . .
完了しました

年月日を変数に代入する

システム変数%DATE%で取得できる日付の文字列を切り出して、年月日をそれぞれ別々の変数に代入する。

set YEAR=%DATE:~0,4%
set MONTH=%DATE:~5,2%
set DAY=%DATE:~8,2%

echo Date: %DATE%
echo Year: %YEAR%
echo Month: %MONTH%
echo Day: %DAY%
set YEAR=%DATE:~0,4%
set MONTH=%DATE:~5,2%
set DAY=%DATE:~8,2%

echo Date: %DATE%
echo Year: %YEAR%
echo Month: %MONTH%
echo Day: %DAY%
実行結果
Date: 2007/05/19
Year: 2007
Month: 05
Day: 19

「%変数:~開始位置,長さ%」で変数の一部分を切り出すことが出来る。 システム変数%DATE%の書式は「yyyy/mm/dd」になっているので、それぞれ一部分を切り出して別々の変数に代入することで年月日を取得できる。

時刻についても同様に取得できる。

set HOUR=%TIME:~0,2%
set MINUTE=%TIME:~3,2%
set SECOND=%TIME:~6,2%

echo Time: %TIME%
echo Hour: %HOUR%
echo Minute: %MINUTE%
echo Second: %SECOND%
set HOUR=%TIME:~0,2%
set MINUTE=%TIME:~3,2%
set SECOND=%TIME:~6,2%

echo Time: %TIME%
echo Hour: %HOUR%
echo Minute: %MINUTE%
echo Second: %SECOND%
実行結果
Time: 16:02:09.71
Hour: 16
Minute: 02
Second: 09

コメント

REMを使えばバッチファイル中にコメントを記述できるが、行頭にREMが並ぶのは見づらい。

REM 年月日を取得する
set YEAR=%DATE:~0,4%
set MONTH=%DATE:~5,2%
set DAY=%DATE:~8,2%

REM 年月日を表示する
echo Year: %YEAR%
echo Month: %MONTH%
echo Day: %DAY%
REM 年月日を取得する
set YEAR=%DATE:~0,4%
set MONTH=%DATE:~5,2%
set DAY=%DATE:~8,2%

REM 年月日を表示する
echo Year: %YEAR%
echo Month: %MONTH%
echo Day: %DAY%

REMの代わりに、GOTOで使用するラベルを定義するために用いるコロン(:)を応用することで、コロン(:)で始まる行をコメント行にすることができる。

:: 年月日を取得する
set YEAR=%DATE:~0,4%
set MONTH=%DATE:~5,2%
set DAY=%DATE:~8,2%

:: 年月日を表示する
echo Year: %YEAR%
echo Month: %MONTH%
echo Day: %DAY%
:: 年月日を取得する
set YEAR=%DATE:~0,4%
set MONTH=%DATE:~5,2%
set DAY=%DATE:~8,2%

:: 年月日を表示する
echo Year: %YEAR%
echo Month: %MONTH%
echo Day: %DAY%

コロン(:)の後ろに続く文字列がラベルとして使用されない限りは意味のない行となるため、コロン(:)で始まっていればその後ろに続く文字は何でもOK。 下記のいずれの表記も文法上エラーとはならず、また意味のない行となるため、コメント行となる。

:: コメント行
:# コメント行
:! コメント行
:% コメント行
:// コメント行
:: コメント行
:# コメント行
:! コメント行
:% コメント行
:// コメント行

乱数を取得する

システム変数%RANDOM%を参照すると0から32767までの乱数を取得できる。

set RANDVAL=%RANDOM%
set RANDVAL=%RANDOM%

ファイルの有無で処理を分岐する

if exist文を用いるとファイルが存在する場合の処理を記述できる。 さらにgoto文と組み合わせることで、ファイルが存在する場合とそうでない場合で処理を分岐させることが出来る。

set FILE=test.txt

if exist %FILE% ( goto FOUND ) else goto NOTFOUND

:FOUND
    echo ファイル%FILE%が見つかりました
    goto END

:NOTFOUND
    echo ファイル%FILE%は存在しません
    goto END

:END
    echo 終了
set FILE=test.txt

if exist %FILE% ( goto FOUND ) else goto NOTFOUND

:FOUND
    echo ファイル%FILE%が見つかりました
    goto END

:NOTFOUND
    echo ファイル%FILE%は存在しません
    goto END

:END
    echo 終了

if not exist文を用いると、ファイルが存在しない場合の処理を記述できる。

set FILE=test.txt

if not exist %FILE% echo ファイル%FILE%は存在しません
set FILE=test.txt

if not exist %FILE% echo ファイル%FILE%は存在しません

他のバッチファイルを呼び出す

callコマンドを用いると、他のバッチファイルを呼び出すことができる。 このとき、引数を指定することもできる。

a.bat
set VAL1=value 1
set VAL2=value 2
call b.bat "引数1" 引数2 %VAL1%
set VAL1=value 1
set VAL2=value 2
call b.bat "引数1" 引数2 %VAL1%
b.bat
echo 1: %~1
echo 2: %~2
echo 3: %~3
echo 4: %~4

echo VAL1=%VAL1%
echo VAL2=%VAL2%
echo 1: %~1
echo 2: %~2
echo 3: %~3
echo 4: %~4

echo VAL1=%VAL1%
echo VAL2=%VAL2%
実行結果
1: 引数1
2: 引数2
3: value
4: 1
VAL1=value 1
VAL2=value 2

引数は「%~番号」で取得できる。 このとき、引用符(")は取り除かれて展開される。 環境変数は展開されてから引数として渡されるので、値に空白が含まれていると引数の区切りとみなされ、別々に渡される点は注意が必要。 また、どちらのバッチファイルも同一プロセスで実行されるため、呼び先のバッチファイルでも呼び元の環境変数を参照することができる。

文字コードの変更

chcpコマンドを用いると、使用する文字コードを変更できる。 引数で指定できる主な文字コードは次のとおり。

コード 名称
932 Shift-JIS (デフォルト)
20932 EUC-JP (IS X 0208-1990 and JIS X 0212-1990)
51932 EUC-JP
65000 UTF-7
65001 UTF-8

引数を指定せずにchcpコマンドを実行すると、現在の文字コードが表示される。

実行結果1
実行結果2

なお、chcpコマンドで文字コードを変更すると、ウィンドウのサイズとフォントが代わり漢字等が正しく表示されなくなるので、次の手順であらかじめフォントを変更しておく必要がある。

  1. コマンドプロンプトのプロパティを開く
  2. 「フォント」タブで「MSゴシック」等のフォントに変更する

参考資料