2011-12-02 12 views
6

Estoy tratando de escribir un archivo por lotes en Windows XP que tiene un nombre de ruta completa y da salida a la versión 8.3 nombre corto ...parámetro por lotes% ~ s1 da incorrecta 8.3 nombre corto

@echo off 
echo "%~s1" 

me he encontrado con un caso particular en que esta salida a una ruta incorrecta y el archivo ...

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" 

Tenga en cuenta que la salida anterior ("C: \ DOCUME ~ 1 \ Angus \ LOCALS ~ 1 \ TEMPOR ~ 1 \ Content.IE5 \ 2JSTM34V \ 62_1_ ~ 1.JA2M34V \ 62 [1] .ja2 ") no existe. Sin embargo, si elimino la sección ".JA2M34V \ 62 [1]" de esa salida, la cadena resultante sería una ruta válida al archivo de entrada original.

Esto parece ser un problema con el uso de corchetes ([]) en el nombre del archivo. Si creo un 62.ja2 archivo en el mismo directorio, la salida será correcta ...

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" 

Es esto un error en Windows? ¿Alguien sabe si hay una solución para permitir que el archivo por lotes maneje correctamente este nombre de archivo?

+0

No, es error en tu código Está utilizando un truco obsoleto que solo existe para compatibilidad con versiones anteriores de software estúpido. No use nombres cortos. –

Respuesta

8

No es un error en su código, ¡es un error de XP!
Con Vista, funciona el mismo código.

Parece una especie de corrupción de búfer.
Depende de la longitud del último nombre de directorio, los últimos caracteres se copian al "nombre corto".

Y sólo se produce si el nombre del archivo es uno o más caracteres de [];,+=<space>

Un caso de prueba corta

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

Los resultados de las últimas líneas

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

Gracias jeb por verificar este error de XP y el muy útil caso de prueba. – Gus

Cuestiones relacionadas