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 |
バグは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)
Comments