#navi(コマンド別)
#contents
////////////////////////////////////////////////////////////////////////////
*set /a リーディングゼロの対処 [#d522de6d]
set /a の算術式の中で、0010 のようにゼロで始まる値は8進数値とみなされるので十でなく八となる。また、08 は不正な8進数としてエラーになる。

-桁数固定の場合
 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 特殊記号の演算子 [#a9da562b]
set /a 文で使える演算子のうち、<< >> & | ^ は、特殊文字なので、各文字を ^ で
クォートするか、" " で囲む必要がある。あるいは、

 set /a N="1 << 2"

のように式全体を " " で囲んでも良い。

% はバッチスクリプト内では %% と書く。

! は遅延展開が無効な場合は特殊文字ではないのでそのままで良いが、遅延展開が
有効な場合は特殊文字となるので ^^ でクォートする必要があるが、そうすると
遅延展開が無効な場合は ^! となるのでエラーとなる。
遅延展開が有効か無効かによって書き方を変える必要がある。

 set /a N=!X            → OK
 set /a N=^^!X          → エラー
 setlocal enabledelayedexpansion
 set /a N=!X            → ! が空に置換されるので、N=X となる
 set /a N=^^!X          → OK

( ) = ~ + - * / は、特殊文字ではないのでそのままで良い。
ただし、) は、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 入力結果の確認 [#if59e8dd]
空入力の時、変数には空がセットされる(未定義になる)のではなく、前の状態のまま不変である。おそらく、

 set ANSWER=Y
 set /p ANSWER=Enter(Y/N) [Y]?

のようにデフォルト値の設定を想定した機能であろう。空入力に対して空の結果を得たい場合は、

 set ANSWER=
 set /p ANSWER=Enter Name:

のようにあらかじめ未定義にしておく必要がある。

ERRORLEVELは、空入力の時に1になる。しかし、空以外の入力の時には0となるわけではなく、その前の値のまま不変である。
従って、空入力の判断にERRORLEVELを使うためには、あらかじめERRORLEVELを0にしておく必要があり、あまり実用的でない。

 cd .   %ERRORLEVEL を 0 にセットする%
 set /p VAR=Enter:
 if ERRORLEVEL 1 echo 空入力だった

 set VAR=
 set /p VAR=Enter:
 if not defined VAR echo 空入力だった

後者のほうがわかりやすい。
////////////////////////////////////////////////////////////////////////////
*set /p による改行なしの文字列表示 [#ccf34f3c]
set /p のプロンプト文字列表示機能を使って、echo と違って改行付加なしで文字列を表示させることが出来る。

 set /p DMY=abcdefg<NUL
 set /p <NUL DMY=abcdefg

また、変数の値はどうせ使わないので変数名は省略してもかまわない。プロンプト文字列を" "で囲んだ場合は" "をはずして表示される。

 set /p <NUL="abcdefg>"
////////////////////////////////////////////////////////////////////////////
*文末の空白 [#faa0faa6]
set を & を使ってマルチステートメントで記述する際、

 set A=abc & set B=def

のように & の前に空白を置くと、Aには abc ではなく、abc空白 がセットされる。
これを避けるためには、

 set A=abc& set B=def

のように & の前に空白を置いてはいけない。または、" " で囲んで、

 set "A=abc" & set "B=def"

ならば空白は含まない文字列がセットされる。

& だけでなく、) や && 、|| の前も同じ。
////////////////////////////////////////////////////////////////////////////
*set "VAR=%A%" [#d6827095]
環境変数Aの値に < > & | 等の特殊文字を含む場合は、

 set VAR=%A%

では、値をセットできない。特殊文字を含んでいても " を含んでいなければ、

 set "VAR=%A%"

と、全体を " " で囲むことで安全に値をセットできる。前項も参照。
////////////////////////////////////////////////////////////////////////////
*環境変数への改行文字のセット [#w24c7fcd]
環境変数へ改行文字をセットすることが出来る。
ただし、参照を % で行うと改行文字の後ろは無視される。
そのため遅延展開を有効にして、! で参照する必要がある。

 setlocal enabledelayedexpansion
 set AAA=ABCDEFG^
 [空行]
 HIJKLMN
 echo !AAA!              → ABCDEFG 改行 HIJKLMN が表示される

[空行]と書いた部分は本当の空行にする。

なお、この方法でセットされる改行文字は CRLF ではなくて、LF の1バイトだけである。
部分文字列参照を行う際には改行文字を1文字としてカウントする。

 setlocal enabledelayedexpansion
 set AAA=
 for /f "delims=" %%A in (filename) do (
 set AAA=!AAA!^
 [空行]
 %%A
 )
 echo !AAA!

のようにファイルの内容を1つの環境変数にセットすることも出来る。

最初に、「%で参照すると改行以降が切れる」と書いたが、( ) で囲むことで、
改行以降も有効に出来る。

 set AAA=echo ABC^
 [空行]
 echo DEF
 %ABC%                → ABC が表示される
 (%ABC%)              → ABC 改行 DEF が表示される
////////////////////////////////////////////////////////////////////////////
#navi(コマンド別)

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS