CmdExe

2004-02-26 10:55:53 +0900 (1729d); rev 2

以下、Windows 2000 SP4 の cmd.exe を仮定する。

unixecho.c

このページでは引数を単に表示するだけのコマンド unixecho を使う。 そのソースコードを以下に示す。

/*
    unixecho.c
*/

#include <stdio.h>

void
print_arg(const char *a)
{
    int i;

    for (i = 0; a[i]; i++) {
        switch (a[i]) {
        case ' ':
            putchar('\\');
            putchar(' ');
            break;
        case '\n':
            putchar('\\');
            putchar('r');
            break;
        case '\r':
            putchar('\\');
            putchar('r');
            break;
        case '\t':
            putchar('\\');
            putchar('t');
            break;
        default:
            putchar(a[i]);
            break;
        }
    }
    putchar('\n');
}

int
main(int argc, char **argv)
{
    int i;

    for (i = 1; i < argc; i++) {
        print_arg(argv[i]);
    }
    exit(0);
}

コマンドエコー

初期状態では、バッチファイル中のコマンドは 実行するタイミングで自動的に画面に出力される。

行頭に「@」を付けるとその行の出力を抑止する (make と同じ)。 「@」で始まるコマンドは「"@..."」で呼べる。

またグローバルにエコーを止めるには echo off と書いておけばよい。 echo off 自体も表示しないようにするためには 「@echo off」とする。

コマンドライン引数

「"..."」は一つの引数になる。両端の「"」は外してプログラムに渡す。 「"」の対応がとれない場合は行末までが一つにつながり、前についている「"」は消える。

C:\>unixecho "a"
a

C:\>unixecho "a a"
a\ a

C:\>unixecho "a"a
aa

C:\>unixecho "a"b"a"
aba

C:\>unixecho "
                 (空文字列)

C:\>unixecho a"
a

C:\>unixecho "a
a

以下のあたりはとてもバグバグちっく。

C:\>unixecho "a""a
a"a

C:\>unixecho "a""a
a"a

C:\>unixecho """
"

C:\>unixecho """"
"

cmd.exe では「'」は特別扱いされない。

C:\>unixecho 'a a'
'a
a'

C:\>unixecho '
'

バッチファイルに引数を渡す場合は「=」でも引数が分割される。 (MS-DOS 3.3 にはすでにあるらしい)

C:\>type myecho.bat
@echo off
echo %1
echo %2

C:\>myecho.bat a=b
a
b

C:\>unixecho a=a          独自コマンドの場合はそのまま
a=a

バッチファイル中では コマンドラインオプションは %1 %2 %3 ... で取れる。 cmd.exe なら全部まとめて %* で渡すこともできる。 「%」という文字自体を書きたいときは「%%」とする。

C:\>type myecho2.bat
@echo off
unixecho %1
unixecho %2
unixecho %*
unixecho %%
unixecho %
unixecho %a

C:\>myecho2 a "b b" c
a
b\ b
a b b c
%

a

コマンドラインでは「%1」と書いても何の意味もない。

C:\>unixecho %1
%1

C:\>unixecho %%1
%%1

C:\>unixecho %*
%*

コマンド名 (バッチファイル名) は %0 で取れる。 呼ばれた名前のまま (相対または絶対パス) で渡される。 ok, ok.bat, .\ok, .\ok.bat, C:\bin\ok.bat など。

C:\>type progname.bat
@echo off
echo %0

C:\>progname
progname

C:\>progname.bat
progname.bat

C:\>C:\progname
C:\progname

環境変数

環境変数は %varname% で参照する 変数名の大文字小文字は無視される。

C:\>echo %COMSPEC%
C:\WINNT\system32\cmd.exe

C:\>echo %CoMsPeC%
C:\WINNT\system32\cmd.exe

存在しない環境変数を指定すると展開されずに残る。

C:\>unixecho %unknown%
%unknown%

環境変数は set コマンドで設定する。

例
set varname=val

C:\>set c=OK

C:\>echo %c%
OK

右辺を空にすると変数を削除できる。 ただしスペースがあってはならない。

C:\>set c=OK

C:\>set c=

C:\>unixecho %c%
%c%

C:\>set c=             「=」のあとにスペースを入れてしまった

C:\>unixecho %c%
                       変数が空文字列として定義されている

set コマンドを引数なしで使うと 現在設定されている環境変数を一覧できる。

C:\>set
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\Administrator\Application Data
CommonProgramFiles=C:\Program Files\Common Files
COMPUTERNAME=NOCTURNE
ComSpec=C:\WINNT\system32\cmd.exe
DISPLAY=localhost:0.0
EDITOR=vi
    :
    :
    :

system revision 1.162