Question

Pour une raison quelconque, mon code ci-dessous ne fonctionne que si le fichier batch se trouve dans le même dossier que les fichiers à renommer même si j'ai spécifié le chemin. Lorsque le fichier batch est dans un dossier différent, je reçois une erreur disant que le fichier ne peut être trouvé. Une entrée à ce sujet?

@echo off&setlocal
set "name1=Bart"
set "name2=Carl"
set "name3=Judy"
for /f "delims=" %%a in ('dir C:\Users\%username%\Downloads\Export_*.csv /b /a-d /o-d') do (
    set "fname=%%~a"
    set /a counter+=1
    SETLOCAL ENABLEDELAYEDEXPANSION
    call set "nname=%%name!counter!%%"
    ren "!fname!" "!nname!%%~xa"
    endlocal
)
Était-ce utile?

La solution

Ajoutez simplement un chemin de travail:

@echo off&setlocal
set "workingpath=%userprofile%\Downloads"
set "name1=Bart"
set "name2=Carl"
set "name3=Judy"
for /f "delims=" %%a in ('dir "%workingpath%\Export_*.csv" /b /a-d /o-d') do (
    set "fname=%%~a"
    set /a counter+=1
    SETLOCAL ENABLEDELAYEDEXPANSION
    call set "nname=%%name!counter!%%"
    ren "%workingpath%\!fname!" "!nname!%%~xa"
    endlocal
)

Autres conseils

Endoro a une bonne solution de travail pour le problème déclaré. Une autre option consiste à simplement pousser vers où se trouvent les fichiers. Ensuite, vous n'avez plus besoin d'inclure le chemin dans le reste du code.

Autres points sans rapport avec la question:

C'est probablement une bonne idée d'initialiser le contre-0, juste au cas où un autre processus définit déjà la valeur sur un nombre.

Tu n'as pas vraiment besoin du nname variable.

Je préfère transférer la valeur de compteur à une variable pour afin que je n'aie pas besoin d'utiliser la construction d'appels. (Pour ceux qui ne le savent pas, le bilan d'agrandissement retardé est de protéger ! caractères qui peuvent être dans le nom de fichier).

@echo off
setlocal
set "name1=Bart"
set "name2=Carl"
set "name3=Judy"
pushd "C:\Users\%username%\Downloads"
set /a counter=0
for /f "delims=" %%a in ('dir Export_*.csv /b /a-d /o-d') do (
  set "fname=%%~a"
  set /a counter+=1
  setlocal enableDelayedExpansion
  for %%N in (!counter!) do (
    endlocal
    ren "!fname!" "!name%%N!.csv"
  )
)
popd

Enfin, Findstr avec l'option / n peut éliminer le besoin d'appel ou supplémentaire pour

@echo off
setlocal
set "name1=Bart"
set "name2=Carl"
set "name3=Judy"
pushd "C:\Users\%username%\Downloads"
for /f "tokens=1* delims=:" %%A in (
  'dir Export_*.csv /b /a-d /o-d ^| findstr /n "^"'
) do (
  set "fname=%%~B"
  setlocal enableDelayedExpansion
  ren "!fname!" "!name%%A!.csv"
  endlocal
)
popd

@cbmanica a raison: le répertoire n'est pas inclus dans la variable fname, vous devrez donc le spécifier manuellement dans le ren commande.

@echo off
setlocal ENABLEDELAYEDEXPANSION
set "name1=Bart"
set "name2=Carl"
set "name3=Judy"
set "dir=C:\Users\%username%\Downloads\"
for /f "delims=" %%a in ('dir %dir%Export_*.csv /b /a-d /o-d') do (
    set "fname=%%~a"
    set /a counter+=1
    :: <Comment> In the below line is the use of "call" necessary? </Comment>
    call set "nname=%%name!counter!%%"
    ren "!dir!!fname!" "!dir!!nname!%%~xa"
)
endlocal

Cela devrait faire exactement ce que vous voulez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top