Domanda

Per qualche motivo il mio codice di seguito funziona solo se il file batch è nella stessa cartella dei file da rinominare anche se ho specificato il percorso. Quando il file batch si trova in una cartella diversa ricevo un errore che dice che il file non può essere trovato. Qualche input su questo?

@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
)
È stato utile?

Soluzione

Basta aggiungere un percorso di lavoro:

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

Altri suggerimenti

Endoro ha una buona soluzione di lavoro per il problema dichiarato. Un'altra opzione è semplicemente spingere dove si trovano i file. Quindi non è più necessario includere il percorso nel resto del codice.

Altri punti non correlati alla domanda:

Probabilmente è una buona idea inizializzare il contatore a 0, nel caso in cui qualche altro processo abbia già impostato il valore su un numero.

Non hai davvero bisogno del nname variabile.

Preferisco trasferire il valore contatore su una variabile per non aver bisogno di utilizzare il costrutto di chiamata. (Per coloro che non lo sanno, l'attificante di espansione ritardata è proteggere ! caratteri che possono essere nel nome del file).

@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

Infine, FindStr con l'opzione /N può eliminare la necessità di chiamata o aggiuntivo per

@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 ha ragione: la directory non viene inclusa nella variabile fname, quindi dovrai specificarlo manualmente nel ren comando.

@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

Questo dovrebbe fare esattamente quello che vuoi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top