2011-12-02 17 views
6

Sto cercando di scrivere un file batch in Windows XP che prende in un nome percorso completo ed emette la versione 8.3 nome breve ...parametro Batch% ~ s1 dà errato 8,3 nome breve

@echo off 
echo "%~s1" 

mi sono imbattuto in un caso particolare, quando questa emette un percorso non corretto e il file ...

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" 

Nota che l'uscita di cui sopra ("C: \ DOCUME ~ 1 \ angus \ LOCALS ~ 1 \ TEMPOR ~ 1 \ Content.IE5 \ 2JSTM34V \ 62_1_ ~ 1.JA2M34V \ 62 [1] .ja2 ") non esiste. Se rimuovo la sezione ".JA2M34V \ 62 [1]" da quell'output, tuttavia, la stringa risultante sarebbe un percorso valido per il file di input originale.

Questo sembra essere un problema con l'uso di parentesi ([]) nel nome del file. Se creo un file 62.ja2 nella stessa directory, l'uscita sarà corretto ...

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" 

Si tratta di un bug in Windows? Qualcuno sa se c'è una soluzione alternativa per consentire al file batch di gestire correttamente questo nome file?

+0

No, è bug nel tuo codice. Stai usando un hack obsoleto che esiste solo per la compatibilità all'indietro con un software stupido. Non usare nomi brevi. –

risposta

8

Non è un bug nel codice, è un bug di XP!
Con Vista lo stesso codice funziona.

Sembra una specie di danneggiamento del buffer.
Dipende dalla lunghezza dell'ultimo nome della directory, gli ultimi caratteri vengono copiati nel "nome breve".

e si verifica solo se il nome del file è uno o più caratteri di [];,+=<space>

Un caso breve 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! 
) 

I risultati delle ultime linee

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

Grazie per aver verificato questo bug di XP e il caso di test molto utile. – Gus

Problemi correlati