批量查找和复制文件列表中的文件


2

我有一个带数千张照片的驱动器。我已将所有内容复制到另一个驱动器中,在此驱动器中,我几个月来一直在缓慢地整理它们。我发现了大量损坏的文件,但发现在原始驱动器上它们没有损坏。

我想做的是拥有一个批处理文件,该文件将从文本文件中读取文件名,并在原始驱动器中搜索文件名,然后将其复制到指定的文件夹中。

由于原始驱动器未排序,因此可能有重复,因此我想将该文件名的所有副本都复制到新文件夹中。我有一个脚本可以执行此操作(请参见下文),但由于文件名太长,它似乎无法正常工作。例如,“ 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

那是什么错误呢?它不应该做什么?
DavidPostill

而不是搜索“ 2008-06-27 02.06.37.jpg” ...它只会读取“ 2008-06-27”,却一无所获。一旦碰到文件名中的空格,它就不会读取该点之后的名称。
JMasters

仍然没有运气。问题似乎在“ for / f“ tokens = *” %% F IN('dir / S / B / A:-D“ %% f”')“行中,而%% f仅读取文本中的文件名,而不是全名,因为文件名中有空格。
JMasters

编辑您的问题并添加一小部分F:\ERRORS\errorlist.txt文件(2至4行就足够了)。
JosefZ,2017年

Answers:


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.
    

JMasters-我将其添加为您的答案,但这可以解决问题,就像您在注释澄清对话中所描述的那样。我能够使用的这种方法重新创建问题并解决问题FOR /F "TOKENS=*"XCOPY如果您仍然需要使用相同的语法,请记住我提到的命令。
Pimp Juice IT IT

那正是我想要的!非常感谢大家的帮助!:)
JMasters
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.