2017-06-30 1 views
1

J'essaie de renommer mes fichiers pour supprimer les caractères qui causent des problèmes dans les scripts. Cela fonctionne bien pour l'esperluette et le point d'exclamation, mais lorsque le fichier a le signe pourcentage, il n'apparaît pas dans la variable pour commencer. Comment transmettre des fichiers avec des caractères spéciaux via la boucle for?Batch: comment remplacer% sign dans une variable?

for %%v in (*) do call :validate "%%v" 
exit /b 

:validate 
set "original=%~nx1" 
set "newtitle=%original:!=%" 
set "newtitle=%newtitle:&=and%" 
setlocal enabledelayedexpansion 
set "newtitle=!newtitle:%%= percent!" 
if not "%newtitle%"=="%original%" ren %1 "%newtitle%" 
+0

Avez-vous déjà vu cette syntaxe? 'Set" Var = String "' – Compo

+0

Oui, pourquoi? Cela n'aide pas. – bricktop

+0

Toujours pas. Avec %% la variable résultante est vide, avec ^% elle reste inchangée. – bricktop

Répondre

1

Votre problème est la ligne for %%v in (*) do call :validate "%%v", because the call` démarre l'analyseur une seconde fois et tous les pourcentages sont évalués une deuxième fois.

Vous devez enregistrer la valeur dans une variable et accéder à cette variable dans votre fonction à la place.

setlocal DisableDelayedExpansion 
for %%v in (*) do (
    set "filename=%%~v" 
    call :validate 
) 
exit /b 

:validate 
setlocal EnableDelayedExpansion 
set "original=!filename!" 
set "newtitle=%original:!=exclam%" 
set "newtitle=!newtitle:&=and!" 
set "newtitle=!newtitle:%=percent!" 
+0

Cela fonctionne, merci! J'apprends de bonnes choses ici. BTW quelles sont les implications si j'aime construire la partie à l'intérieur de la parenthèse en une seule ligne? Est-ce simplement mal vu? – bricktop

+0

@JohnnyRogers Voulez-vous dire 'set 'filename = %% ~ v" & call: validate'? Cela fonctionne, mais cela n'a aucun avantage. Et c'est plus difficile à lire – jeb

+0

OK, roger ça. – bricktop

1

Une façon est d'utiliser delayed expansion:

set "newfilename=%filename:&=and%" 
setlocal EnableDelayedExpansion 
set "newfilename=!newfilename:%%= percent!" 

endlocal 

Le % --sign doit être échappé en ce doublement dans un fichier batch.

Notez que la variable n'est plus disponible au-delà de la commande endlocal.

J'ai utilisé la syntaxe citée, qui est le moyen le plus sûr de définir des variables, même avec des espaces et des caractères spéciaux.