0

米国英語ロケールでWindows2008R2を使用しています。8月1日以降、バッチファイルが機能しなくなりました。3月から7月までは問題なく動作していました。

スクリプトは、先行ゼロを含む数値の月を文字列に変換します。これが再現するスクリプトです。実際のバッチスクリプトは、%date%から数値の月を抽出します。

set month=07

REM convert numerical month to string
for /f "tokens=%month%" %%A in (
    "jan feb mar apr may jun jul aug sep oct nov dec") do (
    set month_str=%%A
)
echo %month_str%

上記は問題なく動作します。「7月」と表示されます

しかし、月を08に変更すると、エラーメッセージが表示されて失敗しました

8" was unexpected at this time

そこで、先行ゼロを削除しました。

set /A month=100%month% %% 100

今、それは再びうまく機能しています、そしてここに私の質問があります

  1. Windows 2008 R2のFORコマンドの公式ドキュメントはどこにありますか?

編集:http ://technet.microsoft.com/en-us/library/cc754900.aspx

  1. トークンオプションにゼロの埋め込み番号を渡すのはおそらく私のせいですが、なぜ07が受け入れられ、08が受け入れられなかったのですか?
  2. 07が有効なパラメーターである場合、それは7と同じですか、それとも他の何かとして解釈されますか?
4

1 に答える 1

1

質問へのコメントに基づいて、Windows が 08 を 8 進数として処理しようとしていることに気付いたようですが、もちろん失敗します。

CMD.EXE 内部コマンドが数値を解析する必要がある場合は常に、 で始まる数値文字列0を 8 進数として、 で始まる数値文字列0xを 16 進数として扱います。オプションで、数字の前に記号を付けることもできます。数値は、符号付き 4 バイト整数として表現できる値 (-2147483648 ~ 2147483647) に制限されます。

Microsoft のドキュメントで 16 進数と 8 進数のサポートについて述べられている唯一の場所は、SET コマンドの /A オプションです。しかし、数値として扱われるすべての文字列は同じように扱われるようです。

これには以下が含まれます:

1) セット /A

set /a 010+0xA
18

2) FOR /F TOKENS および SKIP オプション

for /f "tokens=010" %A in ("1 2 3 4 5 6 7 8 9 10") do @echo %A
8

3)/Lの場合

for /l %N in (010 1 0xA) do @echo %N
8
9
10

3) IF 数値比較

if 012==0xA echo match
match

4) 部分文字列演算を使用した変数展開(負の数の例)

set "test=0123456789ABCDEF"
echo %test:~-0xA,-010%
67

今思いつくのはこれだけですが、他にもあるかもしれません。

于 2012-08-03T21:22:51.317 に答える