2011-12-02 2 views
6

Je suis en train d'écrire un fichier de commandes dans Windows XP qui prend un nom de chemin complet et fournit le 8.3 version courte nom ...paramètre de lot% ~ s1 donne incorrect 8.3 nom court

@echo off 
echo "%~s1" 

Je suis venu dans un cas particulier lorsque cette commande affiche un chemin incorrect et le fichier ...

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" 

Notez que la sortie ci-dessus ("C: \ DOCUME ~ 1 \ angus \ ~ 1 LOCALS \ TEMPOR ~ 1 \ Content.IE5 \ 2JSTM34V \ 62_1_ ~ 1.JA2M34V \ 62 [1] .ja2 ") n'existe pas. Si je supprime la section «.JA2M34V \ 62 [1]» de cette sortie, la chaîne résultante serait un chemin d'accès valide au fichier d'entrée d'origine.

Cela semble être un problème avec l'utilisation de parenthèses ([]) dans le nom de fichier. Si je crée un fichier 62.ja2 dans le même répertoire, la sortie sera correcte ...

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" 

Est-ce un bogue dans Windows? Est-ce que quelqu'un sait s'il existe une solution de contournement pour permettre au fichier batch de gérer correctement ce nom de fichier?

+0

Non, c'est bug dans votre code. Vous utilisez un hack obsolète qui n'existe que pour la compatibilité ascendante avec un logiciel stupide. N'utilisez pas de noms courts. –

Répondre

8

Ce n'est pas un bug dans votre code, c'est un bug d'XP!
Avec Vista, le même code fonctionne.

Cela ressemble à une sorte de corruption de tampon.
Cela dépend de la longueur du dernier nom de répertoire, les derniers caractères sont copiés dans le "nom abrégé".

Et il ne se produit que si le nom de fichier est un ou plusieurs caractères de [];,+=<space>

Un cas de test court

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

Les résultats des dernières lignes

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

Merci jeb pour avoir vérifié ce bug XP et le cas de test très utile. – Gus

Questions connexes