Pregunta

Por alguna razón, mi código a continuación solo funciona si el archivo por lotes está en la misma carpeta que los archivos a renombrar a pesar de que he especificado la ruta. Cuando el archivo por lotes está en una carpeta diferente, recibo un error diciendo que el archivo no se puede encontrar. ¿Alguna entrada sobre esto?

@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
)
¿Fue útil?

Solución

Solo agregue una ruta de trabajo:

@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
)

Otros consejos

Endoro tiene una buena solución de trabajo para el problema declarado. Otra opción es simplemente presionar a donde se encuentran los archivos. Entonces ya no necesita incluir la ruta en el resto del código.

Otros puntos no relacionados con la pregunta:

Probablemente sea una buena idea inicializar el contador a 0, en caso de que algún otro proceso ya establezca el valor en un número.

Realmente no necesitas el nname variable.

Prefiero transferir el valor del contador a A For Variable para que no necesite usar la construcción de llamadas. (Para aquellos que no saben, la alternativa de expansión tardía es proteger ! caracteres que pueden estar en el nombre del archivo).

@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

Finalmente, Findstr con la opción /n puede eliminar la necesidad de llamar o adicional para

@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 tiene razón: el directorio no se está incluidos en la variable fname, por lo que tendrá que especificarlo manualmente en el ren dominio.

@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

Eso debería hacer exactamente lo que quieres.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top