2011-12-02 14 views
6

Próbuję napisać plik wsadowy w systemie Windows XP, które odbywają się w pełni kwalifikowanej nazwy ścieżki i wysyła wersję 8.3 krótkie imię ...parametr Batch% ~ s1 daje błędny 8.3 Nazwa skrócona

@echo off 
echo "%~s1" 

mam natknąć jednym szczególnym przypadku, gdy ten wyprowadza nieprawidłową ścieżkę i plik ...

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" 

Należy zauważyć, że powyższe wyjście ("C: \ DOKUME ~ 1 \ Angus \ LOCALS ~ 1 \ tempor ~ 1 \ Content.IE5 \ 2JSTM34V \ 62_1_ ~ 1.JA2M34V \ 62 [1] .ja2 ") nie istnieje. Jeśli jednak usuniemy sekcję ".JA2M34V \ 62 [1]" z tego wyjścia, wynikowy ciąg będzie poprawną ścieżką do oryginalnego pliku wejściowego.

To wydaje się być problemem przy użyciu nawiasów ([]) w nazwie pliku. Jeśli utworzę plik 62.ja2 w tym samym katalogu, wynik będzie poprawny ...

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" 

Czy to błąd w systemie Windows? Czy ktokolwiek wie, czy istnieje obejście pozwalające plikowi wsadowemu prawidłowo obsługiwać tę nazwę pliku?

+0

Nie, to błąd w kodzie. Używasz przestarzałego narzędzia hakerskiego, które istnieje tylko w celu zapewnienia wstecznej zgodności z głupim oprogramowaniem. Nie używaj krótkich nazw. –

Odpowiedz

8

To nie jest błąd w kodzie, to błąd XP!
W systemie Vista ten sam kod działa.

Wygląda to na rodzaj uszkodzenia bufora.
Zależy od długości ostatniej nazwy katalogu, ostatnie znaki są kopiowane do "krótkiej nazwy".

I to tylko wtedy, jeżeli w nazwie pliku jest jeden lub więcej znaków z [];,+=<space>

Przypadek krótki test

@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! 
) 

Wyniki ostatnich liniach

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

Dzięki Jeb za weryfikację tego błędu XP i bardzo przydatny przypadek testowy. – Gus

Powiązane problemy