2011-12-02 8 views
6

私は完全修飾パス名を取り込んで、8.3形式の短い名前のバージョンを出力のWindows XPでのバッチファイルを作成しようとしている...バッチパラメータ%〜s1が間違って8.3形式の短い名前になります

@echo off 
echo "%~s1" 
私は、これは間違ったパスとファイルを出力し一つの特定のケースに遭遇してきた

...

C:\>test.bat "C:\Documents and Settings\angus\Local Settings\Temporary Internet Files\Content.IE5\2JSTM34V\62[1].ja2" 
"C:\DOCUME~1\angus\LOCALS~1\TEMPOR~1\Content.IE5\2JSTM34V\62_1_~1.JA2M34V\62[1].ja2" 

なお、上記の出力( "C:\ DOCUME〜1つの\アンガス\ LOCALS〜1 \ TEMPOR〜1 \コンテンツ.IE5 \ 2JSTM34V \ 62_1_〜1.JA2M34V \ 62 [1] .ja2 ")は存在しません。しかし、その出力から ".JA2M34V \ 62 [1]"セクションを削除すると、結果の文字列は元の入力ファイルへの有効なパスになります。

これは、ファイル名に角括弧([])を使用すると問題があるようです。私は、同じディレクトリ内のファイル62.ja2を作成した場合、出力が...

C:\>test.bat "C:\Documents and Settings\angus\Local Settings\Temporary Internet Files\Content.IE5\2JSTM34V\62.ja2" 
"C:\DOCUME~1\angus\LOCALS~1\TEMPOR~1\Content.IE5\2JSTM34V\62.ja2" 

これは、Windowsのバグですが正しいのだろうか?バッチファイルがこのファイル名を適切に処理するための回避策があるかどうかは誰にも知られていますか?

+0

最後の行の結果はありません、それはだである場合にのみ発生しますあなたのコードのバグ。あなたは愚かなソフトウェアとの下位互換性のためだけに存在する古いハックを使用しています。短い名前は使用しないでください。 –

答えて

8

あなたのコードにはバグではありません。それはXPのバグです!
Vistaでは同じコードが動作します。

バッファの破損のようです。
最後のディレクトリ名の長さによって異なります。最後の文字は「短い名前」にコピーされます。

とファイル名に[];,+=<space>

のうち一個の以上の文字の短いテストケース

@echo off 
setlocal EnableDelayedExpansion 
set myDir= 
set myFile=a[1].bat 
set map=123456789ABCDEFGHIJKLMNOPQRSTUVW 

for /L %%n in (0 1 26) do (
    set "myDir=!myDir!!map:~%%n,1!" 
    md !myDir! 
    echo dummy > "!myDir!\!myFile!" 
    echo Dir=!myDir! 
    for %%X in ("!myDir!\!myFile!") do echo %%~sX 
    echo(
    del "!myDir!\!myFile!" > nul 
    rd !myDir! 
) 

Dir=123456789A 
    C:\Projekte\batch\123456~1\A_1_~1.BAT 

Dir=123456789AB 
    C:\Projekte\batch\123456~1\A_1_~1.BATt 

Dir=123456789ABC 
    C:\Projekte\batch\123456~1\A_1_~1.BATat 

Dir=123456789ABCD 
    C:\Projekte\batch\123456~1\A_1_~1.BATbat 

Dir=123456789ABCDE 
    C:\Projekte\batch\123456~1\A_1_~1.BAT.bat 

Dir=123456789ABCDEF 
    C:\Projekte\batch\123456~1\A_1_~1.BAT].bat 

Dir=123456789ABCDEFG 
    C:\Projekte\batch\123456~1\A_1_~1.BAT1].bat 

Dir=123456789ABCDEFGH 
    C:\Projekte\batch\123456~1\A_1_~1.BAT[1].bat 

Dir=123456789ABCDEFGHI 
    C:\Projekte\batch\123456~1\A_1_~1.BATa[1].bat 

Dir=123456789ABCDEFGHIJ 
    C:\Projekte\batch\123456~1\A_1_~1.BAT\a[1].bat 

Dir=123456789ABCDEFGHIJK 
    C:\Projekte\batch\123456~1\A_1_~1.BATK\a[1].bat 

Dir=123456789ABCDEFGHIJKL 
    C:\Projekte\batch\123456~1\A_1_~1.BATKL\a[1].bat 

Dir=123456789ABCDEFGHIJKLM 
    C:\Projekte\batch\123456~1\A_1_~1.BATKLM\a[1].bat 

Dir=123456789ABCDEFGHIJKLMN 
    C:\Projekte\batch\123456~1\A_1_~1.BATKLMN\a[1].bat 

Dir=123456789ABCDEFGHIJKLMNO 
    C:\Projekte\batch\123456~1\A_1_~1.BATKLMNO\a[1].bat 

Dir=123456789ABCDEFGHIJKLMNOP 
    C:\Projekte\batch\123456~1\A_1_~1.BATKLMNOP\a[1].bat 

Dir=123456789ABCDEFGHIJKLMNOPQ 
    C:\Projekte\batch\123456~1\A_1_~1.BATKLMNOPQ\a[1].bat 

Dir=123456789ABCDEFGHIJKLMNOPQR 
    C:\Projekte\batch\123456~1\A_1_~1.BATKLMNOPQR\a[1].bat 
+0

このXPのバグを検証してくれたjebと、非常に便利なテストケースです。 – Gus