Windows 2000の CMD.exe のバグ と XPの CMD.exe を使う方法

Windows XP上で次のようなバッチファイルを実行してみると

@echo off
set ABCD=えービーCD
for /f %%A in ('set ABCD') do echo %%A
for /f %%A in ('echo %%ABCD%%') do echo %%A
for /f %%A in ('echo %ABCD%') do echo %%A
for /f %%A in ('echo えービーCD') do echo %%A
for /f %%A in ("えービーCD") do echo %%A
pause

結果は次のようになります。

ABCD=えービーCD
えービーCD
えービーCD
えービーCD
えービーCD
続行するには何かキーを押してください . . .


ところが、Windows 2000上だと、

ABCD=えービーCD
えービーCD
えービー
えービー
えービーCD
続行するには何かキーを押してください . . .

の様になってしまいます。

FOR を /F オプションを指定した場合、 IN の後ろが単純な括弧の場合はファイル名、 括弧の中にダブルクオーテーションがある場合は文字列、括弧の中がシングルクオーテーションの場合は、コマンド解析になります。

for /f %%A in ('echo %ABCD%') do echo %%A
for /f %%A in ('echo えービーCD') do echo %%A

の2文、つまり、echo 文が実行された結果にワード文字があると、文字数が少なくなってしまうバグがあるわけです。
なお、echo 以外のコマンドの場合は、問題がないようです。

そこで、Windows XP SP3のアーカイブに入っている CMD.EXEが使えないかためしてみることにしました。

Microsoft Windows XP [Version 5.0.2195]
(C) Copyright 1985-2001 Microsoft Corp.

ABCD=えービーCD
えービーCD
えービーCD
えービーCD
えービーCD
Press any key to continue . . .

バグはcmd.exeにあることがこれで、確実です。
ところが、日本語ではなく英語になってしまいます。

ためしに、Profiling してみると、

GetProcAddress(0x77E50000 [KERNEL32.DLL], "SetThreadUILanguage") called from "CMDXP.EXE" at address 0x4AD04D6E and returned NULL. Error: (127).

が返ってきます。

というわけで、KDWのkernel32.dllを簡易インストールしてみたところ、うまく日本語モードになりました。

関連サイト:
for /f %A in ('command ....') の日本語処理のバグ (Win2K)
それはそれ。これはこれ。
[WIN2000] for in ( ) do .. の日本語(全角)文字処理にバグあり (DOSプロンプト活用相談室LOG)

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です