2017-06-30 2 views
1

Je veux renommer certains fichiers nommés initialement comme ceci:lot: renommer des fichiers par des numéros de remplissage avec des zéros

KIT0_rawinput_descriptors.m => KIT00_rawinput_descriptors.m 
KIT0_rawinput_estimation.m => KIT00_rawinput_estimation.m 
KIT0_rawinput_label_kp.m 
KIT1_rawinput_descriptors.m => KIT01_rawinput_descriptors.m 
KIT1_rawinput_estimation.m 
KIT1_rawinput_label_kp.m 

J'ai écrit ce fichier batch mais il ne fonctionne pas dit qu'il existe un autre fichier avec le le même nom ou fichier n'est pas trouvé! Je ne comprends pas le point! S'il vous plaît aidez-moi

setlocal enableextensions enabledelayedexpansion 
set idx="xx" 
for /l %%x in (0, 1, 1) do (
    Set "Pattern=KIT%%x_" 
    Set "Replace=KIT0%%x_" 
    for /r %%# in (*!Pattern!*) do (
     Set "File=%%~nx#" 
     echo "!File!" 
     rem Ren "%%#" "!File:%Pattern%=%Replace%!" 
     ) 
    ) 
endlocal 
+0

Pourriez-vous simplement remplacer/remplacer 'KIT' par' KIT0' – Compo

Répondre

1

Quoique vous utilisez l'expansion retardé votre %Replace% est déjà dans une zone nécessitant une expansion retardée, vous devez donc deux fois avec une autre méthode:

setlocal enableextensions enabledelayedexpansion 
set idx="xx" 
for /l %%x in (0, 1, 1) do (
    Set "Pattern=KIT%%x_" 
    Set "Replace=KIT0%%x_" 
    for /r %%# in (*!Pattern!*) do (
     Set "File=%%~nx#" 
     echo "!File!" 
     Call Echo Ren "%%#" "%%File:!Pattern!=!Replace!%%" 
     ) 
    ) 
endlocal 

Si la sortie semble supprimer OK l'écho entre Call et Ren.

+0

Je ne connais pas vraiment les fichiers batch! lorsque vous dites "une zone nécessitant une expansion retardée" est-ce à cause de "for/r %% # in"? sinon si c'est à cause de quoi? L'expansion retardée est effectuée en utilisant un double pourcentage "%%"? quelle est la différence entre ce symbole d'expansion "%" et celui-ci "!" merci beaucoup pour l'aide et vos réponses – Yazan

+0

En bref: c'est la façon dont cmd analyse le lot. Les variables de la zone entre parenthèses (blocs de code) sont évaluées en premier. Si vous définissez ** une variable à l'intérieur d'un bloc de code, sa nouvelle valeur n'est récupérée qu'avec une extension retardée. Dans votre cas, Motif et Remplacer sont définis dans un bloc de code et la commande de remplacement elle-même nécessite une extension retardée pour forcer les valeurs réelles et aussi pour la variable Fichier. Le pseudo-appel est une ancienne méthode utilisée ici pour l'expansion double edelayed. Pour des détails sur comment cmd analyse batche voir [cette Q & A] (https://stackoverflow.com/questions/4094699) – LotPings

+0

merci pour votre aide et explication – Yazan