我有一个驱动器,里面有几千张照片。我把它们全部复制到另一个驱动器,几个月来我一直在慢慢整理它们。我发现了大量损坏的文件,但发现原始驱动器上的文件没有损坏。
我想要做的是有一个批处理文件,它将从文本文件中读取文件名并在原始驱动器中搜索文件名,然后将其复制到指定的文件夹。
由于原始驱动器未排序,因此可能会有重复文件,因此我想将该文件名的所有副本复制到新文件夹。我有一个脚本可以做到这一点(见下文),但由于文件名太长,它似乎不起作用。例如,“ 2008-06-27 02.06.37.jpg
”...脚本将搜索“ 2008-06-27
”,而不是完整文件名。
关于如何修复此问题您有什么想法吗?
这是我迄今为止所做的工作,但仍未按预期进行:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
cls
set dest=F:\ERRORS\recovered
for /f %%f in (F:\ERRORS\errorlist.txt) do (
set i=1
for /f "tokens=*" %%F IN ('dir /S /B /A:-D "%%f"') Do (
for %%N in ("%%F") Do (
set name=%%~NN
set ext=%%~XN
)
copy "%%F" "%dest%\!name!_!i!!ext!"
set /A i=!i!+1
)
)
ENDLOCAL
答案1
您应该将其添加到从文件列表中读取的"TOKENS=*"
循环中FOR /F
,以确保从文件列表中读取的文字字符之间有空格的行不会被解释为分隔符或新行,从而切断在空格处迭代的字符串,而不是获取您需要循环的整行字符,包括回车符或换行符之前的任何空格。
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
cls
set dest=F:\ERRORS\recovered
for /f "TOKENS=*" %%f in (F:\ERRORS\errorlist.txt) do (
set i=1
for /f "tokens=*" %%F IN ('dir /S /B /A:-D "%%~f"') Do (
for %%N in ("%%F") Do (
set name=%%~NN
set ext=%%~XN
)
copy "%%~F" "%dest%\!name!_!i!!ext!"
set /A i=!i!+1
)
)
ENDLOCAL
更多资源
FOR /?
tokens=x,y,m-n - specifies which tokens from each line are to be passed to the for body for each iteration. This will cause additional variable names to be allocated. The m-n form is a range, specifying the mth through the nth tokens. If the last character in the tokens= string is an asterisk, then an additional variable is allocated and receives the remaining text on the line after the last token parsed.