重命名批处理文件必须在同一个文件夹中

时间:2013-11-06 22:44:05

标签: batch-file batch-rename

出于某种原因,我的代码仅在批处理文件与要重命名的文件位于同一文件夹中时才有效,即使我已指定路径。当批处理文件位于不同的文件夹中时,我收到错误消息,指出无法找到该文件。有什么输入?

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

3 个答案:

答案 0 :(得分:3)

只需添加工作路径:

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

答案 1 :(得分:2)

Endoro对于所述问题有一个很好的工作解决方案。另一种选择是将PUSHD简单地放到文件所在的位置。然后,您不再需要在代码的其余部分中包含路径。

与问题无关的其他要点:

将计数器初始化为0可能是个好主意,以防某些其他进程已将值设置为数字。

您真的不需要nname变量。

我更喜欢将计数器值传递给FOR变量,这样我就不需要使用CALL结构了。 (对于那些不知道的人,延迟扩展切换是为了保护文件名中可能包含的!个字符。)

@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

最后,带有/ N选项的FINDSTR可以消除对CALL或其他FOR

的需要
@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

答案 2 :(得分:1)

@cbmanica是对的:该目录未包含在变量fname中,因此您必须在ren命令中手动指定该目录。

@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

这应该完全符合你的要求。