Batch file 路径正在扩展到单个元素?

Batch file 路径正在扩展到单个元素?,batch-file,command,dos,Batch File,Command,Dos,我正在尝试创建一个批处理文件,以便将我的\iTunes\Movies\文件夹中的目录备份到一个外部驱动器(如果这些目录在该外部驱动器上尚不存在): @echo off cls SetLocal EnableDelayedExpansion for /f "delims=" %%F in ('dir /ad /b') do ( if not exist g:\movies\%%F ( echo Copying %%F to G:\Movies\%%F rem

我正在尝试创建一个批处理文件,以便将我的\iTunes\Movies\文件夹中的目录备份到一个外部驱动器(如果这些目录在该外部驱动器上尚不存在):

@echo off 
cls
SetLocal EnableDelayedExpansion

for /f "delims=" %%F in ('dir /ad /b') do (
if not exist g:\movies\%%F      (
        echo Copying %%F to G:\Movies\%%F
rem         md G:\Movies\%%F
rem         copy M:\iTunes\Movies\%%F\*.* G:\Movies\%%F
    )
)
以下是输出:

Code:
Copying The Princess Bride to G:\Movies\The Princess Bride
Copying Green to G:\Movies\Green
Copying Red to G:\Movies\Red
Copying Princess to G:\Movies\Princess
Copying Bride to G:\Movies\Bride
Copying The Green Mile to G:\Movies\The Green Mile
Copying The Shawshank Redemption to G:\Movies\The Shawshank Redemption
Copying Grape to G:\Movies\Grape
Copying Roof to G:\Movies\Roof
Copying On to G:\Movies\On
Copying Fiddler On the Roof to G:\Movies\Fiddler On the Roof
Copying Brief to G:\Movies\Brief
Copying Number to G:\Movies\Number
Copying to to G:\Movies\to
Copying the to G:\Movies\the
Copying Gilbert Grape to G:\Movies\Gilbert Grape
Copying Torino to G:\Movies\Torino
Copying Sherlock Holmes to G:\Movies\Sherlock Holmes
Copying Gran Torino to G:\Movies\Gran Torino
Copying I Am Number Four to G:\Movies\I Am Number Four
Copying Too Big to Fail to G:\Movies\Too Big to Fail
Copying Pelican to G:\Movies\Pelican
Copying The Shunning to G:\Movies\The Shunning
Copying Inside Job to G:\Movies\Inside Job
Copying Shawshank to G:\Movies\Shawshank
Copying Holmes to G:\Movies\Holmes
Copying Four to G:\Movies\Four
Copying Am to G:\Movies\Am
Copying Big to G:\Movies\Big
Copying Job to G:\Movies\Job
Copying Mile to G:\Movies\Mile
Copying Fail to G:\Movies\Fail
Copying The Pelican Brief to G:\Movies\The Pelican Brief
Copying Shunning to G:\Movies\Shunning
Copying Redemption to G:\Movies\Redemption
Copying Labyrinth to G:\Movies\Labyrinth
Copying The Hunger Games to G:\Movies\The Hunger Games

M:\iTunes\Movies>
它不仅正确地使用了完整的目录名,例如“绿色英里”,而且还错误地使用了iTunes\Movies文件夹中存在但外部驱动器中不存在的每个目录的“the”和“Green”以及“Mile”

我尝试过使用和不使用EnableDelayedExpansion,尝试过各种类型的变量赋值,但都没有效果


我只是不明白,我已经“delims=”编程了,并且我已经尝试过在%%F周围使用双引号,那么为什么它要将表达式分解为单个元素呢?

您需要在命令本身的名称周围加引号,并且您需要标记=*部分(如此处所述)”


只要您在Windows命令中有一个参数,并且该参数是从可能包含空格的批处理变量生成的(与文件名一样),就需要引号

这是我的格式副本。因为有几个增强功能将使您的脚本受益。不过,修复它所需的唯一方法是引用exist、md和copy路径

  • 使用简单目录进行循环
  • 使用
    ~nx
    选项删除周围的引号,并在命令行解析器决定更改其返回值的方式时仅使用文件夹的名称。(未来证明)
  • 在exist和copy路径的末尾添加了
    \
    ,以指定它是一个目录,并且不匹配可能具有相同名称的任何文件
  • copy
    放在
    md
    之后,并带有
    &&
    ,这意味着只有在成功创建目录时才会进行复制
  • 代码:


    如果您需要更多选项,我还建议您查看
    xcopy
    robocopy
    命令。

    FYI:
    delims=
    将产生与
    tokens=*
    相同的输出。脚本的问题在于您更正时的引用。@DavidRuhmann-实际上它们并不总是产生相同的结果
    “tokens=*”
    将从字符串中去掉前导空格和制表符,而
    “delims=“
    保留所有内容。从技术上讲,文件名可以以空格开头,但我认为我从未在“野外”看到过空格@dbenham下次我会更具体。我的评论是针对OP的具体用法,因为他们是如何使用for循环的;脚本不会通过将其更改为
    tokens=*
    来修复。我不想让任何人认为,修复需要
    tokens=*
    ,但同时我需要确保我不会混淆人们认为他们是一样的。
    :)
    就我个人而言,我会说在(*)do循环中使用
    for/d%%d。
    
    @echo off 
    cls
    SetLocal EnableDelayedExpansion
    
    for /f "tokens=*" %%F in ('dir /ad /b') do (
    if not exist "g:\movies\%%F"      (
            echo Copying "%%F" to "G:\Movies\%%F"
    rem         md "G:\Movies\%%F"
    rem         copy "M:\iTunes\Movies\%%F\*.*" "G:\Movies\%%F"
        )
    )
    
    @echo off 
    cls
    SetLocal EnableDelayedExpansion
    
    for /d %%D in (*) do if not exist "G:\Movies\%%~nxD\" (
        echo Copying %%~fD to G:\Movies\%%~nxD
        rem md "G:\Movies\%%~nxD" && copy "%%~fD\*.*" "G:\Movies\%%~nxD\"
    )