2011-12-02 20 views
6

我試着寫在Windows XP中,它接受一個完全合格的路徑名和輸出8.3短名稱版本的批處理文件...批處理參數%〜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 \ Content.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

謝謝jeb驗證這個XP錯誤和非常有用的測試用例。 – Gus

相關問題