2010-12-13 15 views
4

J'ai un dossier contenant un grand nombre de fichiers. Beaucoup de noms de fichiers ont des caractères '%' et/ou '&'.Script pour supprimer les caractères spéciaux des noms de fichiers

e.g. Test&doc.pdf 
e.g Test%doc.doc 

est-il un moyen rapide, je pouvais supprimer les caractères « % » et « » & en utilisant un fichier de commandes Windows, VBScript ou quelque chose de similaire?

Toute aide sera grandement appréciée.

Merci.

+0

Pourquoi un fichier batch? – CodesInChaos

+0

Le dossier se trouve sur un serveur distant auquel je n'ai pas accès. Donc, je veux donner à la personne qui a accès un script qui peut juste être couru une fois. –

+0

Je suppose qu'il ne doit pas être un fichier batch. Ce pourrait être un vbscript ou quelque chose de similaire. Je vais mettre à jour la question. –

Répondre

2

J'ai rapidement jeté ça ensemble et je ne l'ai pas testé, mais ce VBScript devrait faire l'affaire. Dites-moi si vous avez besoin des trucs de fantaisie comme récursif dossier remplaçant etc.

Set objFSO = CreateObject("Scripting.FileSystemObject") 

'Your folder here 
objStartFolder = "X:\MYFOLDER" 

Set objFolder = objFSO.GetFolder(objStartFolder) 
Set regEx = New RegExp 

'Your pattern here 
regEx.Pattern = "[&%]" 

Set colFiles = objFolder.Files 
For Each objFile in colFiles 
    objFile.Rename(regEx.Replace(objFile.Name, "") 
Next 
+0

Était sur le point de télécharger ma propre réponse qui fonctionne de la même manière. Merci de votre aide! –

3

Voici comment vous pouvez le faire dans le lot (au cas où vous êtes curieux). La grande limite est que si vous avez des noms de fichiers avec plus d'un signe de pourcentage, cela ne fonctionnera pas parce que le shell l'étend à une variable. Je ne sais pas immédiatement comment résoudre ce problème.

Il commence à partir du répertoire dans lequel se trouve le script et fonctionne de manière récursive sur tous les sous-répertoires.

@echo off 

setlocal enabledelayedexpansion 
for /f "usebackq delims=" %%N in (`dir /s /b`) do (
    set var=%%~nN 
    set var=!var:^&= ! 
    set var=!var:%%= ! 

    if not "!var!"=="%%~nN" (
    if not exist "%%~dpN!var!%%~xN" (
     echo "%%N" --^> "!var!%%~xN" 
     ren "%%N" "!var!%%~xN" 
    ) else (
     echo File "!var!%%~xN" ^(from %%N^) already exists. 
    ) 
) 
) 

Par ex, les impressions sortie comme ceci:

C:\batch\schar>schar 
"C:\batch\schar\Test%doc.doc" --> "Test doc.doc" 
"C:\batch\schar\Test%doc.pdf" --> "Test doc.pdf" 
File "Test doc.pdf" (from C:\batch\schar\Test&doc.pdf) already exists. 
"C:\batch\schar\subdir\FILE%here" --> "FILE here" 
+0

Je l'ai testé et il fonctionne aussi avec des signes de pourcentage, mais il échoue avec des marques d'exclamaton et des carets. – jeb

+0

@jeb: Merci d'avoir vérifié. Plus j'y regarde, plus je me rends compte de ce problème incroyablement difficile à résoudre. Je n'arrive pas à comprendre comment arrêter le shell d'évaluer des caractères spéciaux dans une chaîne. Cette réponse a tellement de limites que je devrais probablement la supprimer. Si quelqu'un peut produire une solution par lots sans limites de caractères, je serai massivement impressionné. – indiv

+0

J'espère que ma solution peut gérer tous les caractères sans limitations – jeb

3

@indiv

Si quelqu'un peut produire une solution de traitement par lots sans limitation de caractère, je serai massivement impressionné.

Ok, je vais essayer.

@echo off 

setlocal DisableDelayedExpansion 
for /f "usebackq delims=" %%N in (`dir /s /b`) do (
    set var=%%~nxN 
    setlocal EnableDelayedExpansion 
    set "org=!var!" 
    set "var=!var:&= !" 
    set "var=!var:%%= !" 

    if not "!var!"=="!org!" (
    if not exist "%%~dpN!var!" (
     echo "!org!" --^> "!var!" 
     ren "!org!" "!var!" 
    ) else (
     echo File "!var!" ^(from !org!^) already exists. 
    ) 
) 
    endlocal 
) 

L'astuce est de faire basculer l'expansion retardée, car l'expansion de la boucle for-vars (%% N) devrait être fait sans expansion retardée, sinon vous perdez les points d'exclamation, et a des problèmes avec carets. Mais pour gérer et modifier les chaînes, vous devez utiliser une extension retardée.

Mais pourquoi? La réponse est de comprendre les phases de l'analyseur par lots.

J'ai essayé de l'expliquer ici. how-does-the-windows-command-interpreter-cmd-exe-parse-scripts

+0

Beau travail, c'est mieux que ma solution. Il y a un problème avec 'Test ^! Doc.xls', où il interprète le caret comme un caractère d'échappement pour'! '. Il produit la substitution 'Test doc.xls' quand il devrait y avoir 2 espaces. La commande 'ren' est également problématique avec des noms de fichiers comme' F% ILE% he% re'. La substitution fonctionne, produisant 'F ILE he re', mais le rename ne fonctionne pas parce que le premier argument de' ren' n'a pas échappé '%'. Je ne pense pas qu'il existe une solution facile pour échapper des caractères spéciaux en batch, ou en supprimant leur évaluation comme '' 'in perl. – indiv

+0

Le renommage de F% ILE% he% fonctionne, car l'expansion avec ren "! Org!" est sûr, car plus d'analyse est faite après l'expansion retardée. Dans mon lot, un "f% test ^! Doc.xls" est renommé "f test ^! Doc.xls" – jeb