我有一个批处理文件,它每 10 秒检查一次根目录中的 PDF 文件,并将这些文件复制到同名的相应子文件夹中。
我缺少的是我需要批处理文件来检查指定文件的目标子目录,如果指定文件存在,则将要复制的新文件重命名为 !filename!001.pdf
并让 001
在复制重复文件名时递增。这是我得到的:
:loop
setlocal enabledelayedexpansion
cls
pushd c:\files\
for /f "tokens=*" %%1 in ('dir /a-d /b c:\files\*.pdf') do (
set filename=%%~n1&set dirname=!filename:~0,7!
dir c:\files /b *.pdf > location1list.tmp
for /f %%a in (location1list.tmp) do dir c:\files\%%a > location2list.tmp
if not exist c:\files\!dirname! (md c:\files\!dirname!)
move %%1 c:\files\!dirname!\>nul
)
timeout /t 10
goto:loop
有什么建议可以让我重命名文件吗?
即如果 Bob.pdf
存在于 Bob
文件夹中,并且另一个 Bob.pdf
添加到 C:\files
文件夹中,我希望将其作为 Bob001.pdf
复制到 C:\files\bob
文件夹。
最佳答案
像这样的东西应该可以达到你想要的效果。可能需要一些调整。另外我没有测试过,只是凭内存写的。需要任何解释,尽管询问。
脚本
@echo off
setlocal EnableExtensions EnableDelayedExpansion
pushd C:\files
:Main
for /f "tokens=*" %%A in ('dir /a-d /b *.pdf') do (
if not exist "%%~dpnA\*" md "%%~nA"
set "File=%%~dpnA\%%~nxA"
if exist "!File!" call :Name "!File!" File
echo !File!
move "%%~fA" "!File!"
)
goto Wait
:Name <Target> <Variable>
set "Count=0"
:Count
set /a "Count+=1"
set "Number=00%Count%"
if exist "%~dpn1%Number:~-3%%~x1" goto Count
set "%~2=%~dpn1%Number:~-3%%~x1"
goto :eof
:Wait
timeout /t 10
goto Main
:End
popd
endlocal
限制
- 每个目标子目录最多只能处理 1000 个文件。如果子目录达到此最大值,则脚本将陷入无限循环。
更新
修复了我的初始脚本中的错误
关于scripting - 批量帮助--将文件移动到目录,如果存在文件名,重命名001,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15250406/