2009-07-09 7 views
3

je suis en train de supprimer des fichiers à l'aide d'un fichier batch .. (winxp)fichiers avec de longues extensions effacé de façon inattendue en utilisant l'invite de commande

mon problème est quand je supprimer à l'aide d'un joker .. il est correspondant à l'aswell nom 8.3 comme le nom long.

par exemple: liste des fichiers

file1.py 
file1.pyc 
file2.pycstlongname 
file2.pycstlongnamec 

si je fais un

Del *.pyc 

il supprime tout sauf file1.py

becuase si je fais tous dir/X Teh 8.3 les noms abrégés se terminent par .PYC

+0

C'est pourquoi j'ai pris l'habitude depuis longtemps d'épeler DEL comme DIR et d'examiner les résultats ... mais cela n'aide pas un fichier BAT. – RBerteig

Répondre

4

Lorsque vous exécutez la gestion de fichiers à l'aide de caractères génériques à partir de l'invite de commande, les fichiers avec des extensions longues peuvent être affichés de façon inattendue, copiés ou supprimés.

Vous avez raison, cela se produit également sur mon ordinateur sous Windows XP SP3. Consultez l'article suivant dans la Base de connaissances Microsoft pour plus d'informations et pour consulter les modifications apportées au Registre afin de résoudre ce problème. Pour plus d'informations, reportez-vous à l'article suivant: http://support.microsoft.com/fr-fr/default.aspx?displaylang=fr. Celui-ci va tout le chemin du retour vers Windows NT 4.0:

Numéro d'article: 164351 - Dernière mise à jour 1 Novembre 2006 - Version: 1.1
Command Prompt's Treatment of Long File Extensions

http://support.microsoft.com/kb/164351

MISE À JOUR: Ce problème se produit également dans une application de test C# que j'ai écrite. Le comportement est assez inquiétant que j'ai appliqué le correctif de registre à mon ordinateur, et cela fonctionne.

+0

* soupir * .. oui .. ce serait juste .. je vais le tester plus tard. je ne vais pas m'aider trop, parce que je veux distribuer le fichier .bat .. et je ne serai pas en mesure de définir le registre sur chaque machine. – ShoeLace

+0

Vous pouvez toujours utiliser la commande REG dans le fichier .BAT pour tester et ajuster la clé. Il semble que cela s'applique au pilote du système de fichiers, donc un redémarrage serait vraiment nécessaire pour qu'il prenne effet. – RBerteig

4

Eh bien, dans votre cas, vous pouvez probablement utiliser forfiles:

> forfiles /m *.pyc 
"file1.pyc" 

il ne respecte pas les règles de cmd d'extension génériques.

Vous pouvez également énumérer tous les fichiers et filtre pour l'extension après:

> for %i in (*) do @if %~xi==.pyc @echo %i 
file1.pyc 

Les deux méthodes sauter les fichiers où seule la partie .3 des matchs d'extension.

Vous pouvez utiliser

forfiles /m *.pyc /c del @FILE 

ou

for %i in (*) do @if %~xi==.pyc @del "%i" 

Il est vrai que, un peu plus complexe qu'un del *.pyc simple, cependant.

ETA: Comme quelqu'un était sceptique si cela fonctionnerait, un petit extrait d'une session cmd sur un Win XP SP 2 VM:

 
S:\Temp>for %i in (file1.py,file1.pyc,file2.pycstlongname,file2.pycstlongnamec) do @copy nul %i 
     1 Datei(en) kopiert. 
     1 Datei(en) kopiert. 
     1 Datei(en) kopiert. 
     1 Datei(en) kopiert. 

S:\Temp>dir /b 
file1.py 
file1.pyc 
file2.pycstlongname 
file2.pycstlongnamec 

S:\Temp>del *.pyc 

S:\Temp>dir /b 
file1.py 

S:\Temp>del * 

S:\Temp>for %i in (file1.py,file1.pyc,file2.pycstlongname,file2.pycstlongnamec) do @copy nul %i 
     1 Datei(en) kopiert. 
     1 Datei(en) kopiert. 
     1 Datei(en) kopiert. 
     1 Datei(en) kopiert. 

S:\Temp>for %i in (*) do @if %~xi==.pyc @del "%i" 

S:\Temp>dir /b 
file1.py 
file2.pycstlongname 
file2.pycstlongnamec 

Nevermind the Les messages allemands, je l'espère, il montre que ci-dessus méthode fonctionne en effet.


Pour expliquer un peu pourquoi cela fonctionne, nous pouvons jeter un oeil à la commande:

for %i in (*) do @if %~xi==.pyc @del "%i" 

La première partie est trivial. for %i in (*) énumère simplement tous les fichiers dans le répertoire en cours. Nous vérifions ensuite l'extension; %~xi étend à la pleine extension (pas 8.3 choses), en cours d'exécution ainsi au-dessus la ligne entraînera les commandes suivantes à exécuter:

 
if .py == .pyc del "file1.py" 
if .pyc == .pyc del "file1.pyc" 
if .pycstlongname == .pyc del "file2.pycstlongname" 
if .pycstlongnamec == .pyc del "file2.pycstlongnamec" 

J'espère qu'il est évident pourquoi cela fonctionne mieux que le globbing fait par cmd qui comprend 8.3 des noms. Pas de jokers ici, rien à faire de mal.

La variante forfiles fonctionne sur mes machines Win 7 et Vista ici. Je ne peux que deviner mais je suspecte fortement, forfiles n'implémente pas les mêmes règles de correspondance génériques que cmd. Puisque nous sommes sur Windows, chaque programme développe des jokers pour lui-même. C'est pas fait par le shell, contrairement aux systèmes UNIX. Comment exactement les programmes font cela diffère parfois et apparemment, il le fait ici aussi. Inutile de dire que je considère l'approche de forfiles ici un peu plus raisonnable car les noms de 8.3 devraient mourir d'une mort horrible bientôt. Ou du moins j'espère qu'ils le feront.

+0

Windows Server 2008 uniquement? –

+0

forfiles existe au moins depuis Windows Vista, même si je l'ai déjà vu sur certaines machines XP héritées. La commande for remonte au moins à NT 4. – Joey

+0

Étant donné le comportement du système d'exploitation en utilisant DEL à partir de l'invite de commande ET FileInfo.Delete() du code C#, je suis sceptique que cela fonctionne réellement. –

Questions connexes