0

出于某种原因,我下面的代码仅在批处理文件与要重命名的文件位于同一文件夹中时才有效,即使我已经指定了路径。当批处理文件位于不同的文件夹中时,我收到一条错误消息,指出找不到该文件。对此有任何意见吗?

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

3 回答 3

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
)
于 2013-11-06T23:36:13.977 回答
2

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

与问题无关的其他要点:

将 counter 初始化为 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
于 2013-11-07T01:10:31.893 回答
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

那应该完全符合您的要求。

于 2013-11-06T23:04:15.600 回答