set /a リーディングゼロの対処

set /a の算術式の中で、0010 のようにゼロで始まる値は8進数値とみなされるので十でなく八となる。また、08 は不正な8進数としてエラーになったり無視されたりする。

  • リーディングゼロがある場合
    set A=0028
    set /a B=%A%+1         → 無効な数字。というエラーになる
    set /a C=A+1           → 8が非数字、Aは002という値と見なされ、Cには3が入る

3行目のようにエラーにならないで意図しない結果となるケースがあるので注意。

対処方法

  • 桁数固定の場合
    set A=08
    set B=0010
    set /a A=1%A%-100
    set /a B=1%B%-10000
    set M=「2桁の数字」
    if 1%M% gtr 112 (Mが12を超える場合の処理)
  • リーディングゼロの有無が不明の場合(キーインデータなど)
    set A=「10000未満の数字でリーディングゼロの有無は不明」
    set /a A=1000%A% %% 10000

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%"

と、全体を " " で囲むことで安全に値をセットできる。前項も参照。



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2005-05-17 (火) 23:35:12 (7127d)