set /a リーディングゼロの対処 †set /a の算術式の中で、0010 のようにゼロで始まる値は8進数値とみなされるので十でなく八となる。また、08 は不正な8進数としてエラーになったり無視されたりする。
3行目のようにエラーにならないで意図しない結果となるケースがあるので注意。 対処方法 †
set /a の単項演算子 †WinXPでは、set /? で単項演算子 ! ~ - の説明があるが、Win2000の set /? には 説明が無い。しかし、実際にはWin2000でもこれらは使える。 意味については説明が無いが、C と同じく、論理NOT、ビットNOT、符号反転である。 set /a 特殊記号の演算子 †set /a 文で使える演算子のうち、<< >> & | ^ は、特殊文字なので、各文字を ^ で クォートするか、" " で囲む必要がある。あるいは、 set /a N="1 << 2" set /a "N=1 << 2" のように式全体を " " で囲んでも良い。 % はバッチスクリプト内では %% と書く。 ! は遅延展開が無効な場合は特殊文字ではないのでそのままで良いが、遅延展開が
有効な場合は特殊文字となるので ^^ でクォートする必要があるが、そうすると
遅延展開が無効な場合は ^! となるのでエラーとなる。 set /a N=!X → OK ( not X ) set /a N=^^!X → エラー set /a N=X^^!Y → OK ( X xor not Y ) setlocal enabledelayedexpansion set /a N=!X → ! が空に置換されるので、N=X となる set /a N=^^!X → OK ( not X ) set /a N=X^^!Y → X!Y となってエラー set /a N=X^^^^!Y → X^Y となる。!は空に置換される set /a N=X^^^^^^!Y → OK ( X xor not Y ) ( ) = ~ + - * / は、特殊文字ではないのでそのままで良い。 ただし、) は、set /a 文が ( ) の中の場合は特殊文字となるので、 ^ か " " でクォートする必要がある。 set /a N=(1+2)*3 → OK (set /a N=(1+2)*3) → エラー (set /a N=(1+2^)*3) → OK (set /a N="(1+2)*3") → OK set /a N=(1+2^)*3 → OK set /p 入力結果の確認 †空入力の時、変数には空がセットされる(未定義になる)のではなく、前の状態のまま不変である。おそらく、 set ANSWER=Y set /p ANSWER=Enter(Y/N) [Y]? のようにデフォルト値の設定を想定した機能であろう。空入力に対して空の結果を得たい場合は、 set ANSWER= set /p ANSWER=Enter Name: のようにあらかじめ未定義にしておく必要がある。 ERRORLEVELは、空入力の時に1になる。しかし、空以外の入力の時には0となるわけではなく、その前の値のまま不変である。 従って、空入力の判断にERRORLEVELを使うためには、あらかじめERRORLEVELを0にしておく必要があり、あまり実用的でない。 set VAR= cd . %ERRORLEVEL を 0 にセットする% set /p VAR=Enter: if ERRORLEVEL 1 echo 空入力だった set VAR= set /p VAR=Enter: if not defined VAR echo 空入力だった 後者のほうがわかりやすい。 set /p による改行なしの文字列表示 †set /p のプロンプト文字列表示機能を使って、echo と違って改行付加なしで文字列を表示させることが出来る。 set /p DMY=abcdefg<NUL set /p <NUL DMY=abcdefg また、変数の値はどうせ使わないので変数名は省略してもかまわない。プロンプト文字列を" "で囲んだ場合は" "をはずして表示される。 set /p <NUL="abcdefg>" 文末の空白 †set を & を使ってマルチステートメントで記述する際、 set A=abc & set B=def のように & の前に空白を置くと、Aには abc ではなく、abc空白 がセットされる。 これを避けるためには、 set A=abc& set B=def のように & の前に空白を置いてはいけない。または、" " で囲んで、 set "A=abc" & set "B=def" ならば空白は含まない文字列がセットされる。 & だけでなく、) や && 、|| の前も同じ。 変数名の空白 †環境変数名には先頭でなければ空白も使用可能である。 set VAR = 123 とすると、「V」「A」「R」「空白」が環境変数名となり、
%VAR % の値が 「 123」となる。 set "VAR=%A%" †環境変数Aの値に < > & | 等の特殊文字を含む場合は、 set VAR=%A% では、値をセットできない。特殊文字を含んでいても " を含んでいなければ、 set "VAR=%A%" と、全体を " " で囲むことで安全に値をセットできる。前項も参照。 |