使用循环批量重命名文件

时间:2015-02-07 11:27:12

标签: batch-file

我有以下批次代码。问题是,当我运行批处理文件时,屏幕截图文件存储在正确的目录中,但批处理代码不会重命名文件。如果批处理文件位于同一目录中,则只能正确重命名。

@echo off
:strt
myprogram savescreenshot "A:\Some Folder\New folder\scr~$currtime.HH_mm_ss$.png"
setlocal disableDelayedExpansion
set "chars=abcdefghijklmnopqrstuvwxyz0123456789"
set mydir=A:\Folder\New folder
:: (tried this too) PATH=%PATH%;A:\Folder\New folder\*.png
for /f "eol=: delims=" %%F in ('dir /b /a-d "%mydir%\*.png"') do call :renameFile "%%F"
exit /b

:renameFile
setlocal enableDelayedExpansion
:retry
set "name="
for /l %%N in (1 1 32) do (
  set /a I=!random!%%36
  for %%I in (!I!) do set "name=!name!!chars:~%%I,1!"
)
if exist "!name!.png" goto :retry
endlocal & ren %1 {%name%}
::ping 192.0.2.0 -n 1 -w 10000 >nul
goto strt

我认为这与这一行有关:

for /f "eol=: delims=" %%F in ('dir /b /a-d "A:\Some folder\New\New folder\*.png"') do call :renameFile "%%F"

如果我将行更改为此

for /f "eol=: delims=" %%F in ('dir /b /a-d *.png') do call :renameFile "%%F"

它完美无缺。

1 个答案:

答案 0 :(得分:0)

@echo off
:strt
myprogram savescreenshot "A:\Some Folder\New folder\scr~$currtime.HH_mm_ss$.png"
setlocal disableDelayedExpansion
set "chars=abcdefghijklmnopqrstuvwxyz0123456789"
set "mydir=A:\Folder\New folder"
pushd "%mydir%"
:: (tried this too) PATH=%PATH%;A:\Folder\New folder\*.png
for /f "delims=" %%F in ('dir /b /a-d "*.png"') do call :renameFile "%%F"
POPD
exit /b

:renameFile
setlocal enableDelayedExpansion
:retry
set "name="
for /l %%N in (1 1 32) do (
  set /a I=!random!%%36
  for %%I in (!I!) do set "name=!name!!chars:~%%I,1!"
)
if exist "!name!.png" goto :retry
endlocal & ren %1 {%name%}
::ping 192.0.2.0 -n 1 -w 10000 >nul
goto :eof

注意更改:

mydir设置 - 添加引号以确保所分配的值中不包含尾随空格(一般原则)

pushd / popd括号 - 将当前目录更改为mydir并恢复原始

eol=:已从for中删除 - 不需要delims=将整行分配到%%F

exit/b可以由goto :eof替换,效果相同

最终goto changed to:eof . This terminates the subroutineand returns to the strt loop. Going to savedcreenshot`的renamefile means that the entire procedure is re-run, starting with,可能会创建另一个文件并随机重命名,无限重复。

你还没有说明你的文件应该做什么。它似乎无休止地重新运行savescreenshot,然后重命名它所找到的匹配*.png的第一个文件。

如果您要将for ...%%F中的文件掩码从*.png更改为*-*.png,则只会重命名尚未重命名的名称(savescreenshot在目标目录中生成名称“scr~ $ currtime.HH_mm_ss $ .png”。这是一个普通的文字名称,除非savescreenshot以某种方式处理它。所以文件“ scr~ $ currtime.HH_mm_ss $ .png“会在原始进程中一遍又一遍地创建和覆盖。” - .png“将仅针对最新创建的文件,因为它是唯一包含-的内容 - 您的重命名例程会将其更改为包含-的文件名