Batch file 路径正在扩展到单个元素?
我正在尝试创建一个批处理文件,以便将我的\iTunes\Movies\文件夹中的目录备份到一个外部驱动器(如果这些目录在该外部驱动器上尚不存在):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
@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
选项删除周围的引号,并在命令行解析器决定更改其返回值的方式时仅使用文件夹的名称。(未来证明)\
,以指定它是一个目录,并且不匹配可能具有相同名称的任何文件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\"
)