批量复制文件的路径空间

时间:2016-01-12 11:33:10

标签: windows batch-file space

我想在批处理文件中将今天创建的所有文件从文件夹A复制到文件夹B.

for /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%a/%%b/%%c)
set MyPath=D:\Temp p
set DestPath=D:\Temp p\1\
forfiles  -m *.* /D %mydate% /C "cmd /c copy %MyPath%\@file %DestPath%"

答案是:

The system cannot find the file specified.

但如果我更改文件夹" Temp p"到"临时" (我的意思是省略空间)它工作正常。我该怎么做?

3 个答案:

答案 0 :(得分:2)

有两件事我想建议你:

  1. 用成对的引号括起路径!

    除了 SPACE 之外,还有更多字符被命令提示符视为分隔符,它们是 TAB ,;=。如果你将""放在所有路径上,那么你就不会遇到这些字符的问题。路径中允许使用其他一些字符,这些字符在批处理文件中具有特殊含义(例如^&());使用引号时也会受到保护。

  2. 始终使用set语法set "VARIABLE=Value"

    这样,引号不会成为分配给变量的值的一部分,而是一些特殊字符,如^&(),{ {1}},<>甚至|不会造成任何麻烦,并且在该命令行尾随 SPACE 不会成为价值无意中。另一个很大的好处是,只有在展开(读取)"之类的变量时才需要关注周围"",因为前面提到的"%VARIABLE%"不包含在值中。因此,您甚至可以将变量用作""等文件路径的一部分,以使整个路径位于"%VARIABLE%\file.txt"之间。
    请注意,此语法仅在启用command extensions时有效,但这仍然是Windows命令提示符的默认语法,只有当您要执行为MS-DOS编写的批处理文件时才禁用它们。 command.com)。

  3. 因此,对于您的代码部分(不检查内部函数),上述意思是:

    ""

    for /F "tokens=2-4 delims=/ " %%a in ('date /T') do (set "mydate=%%a/%%b/%%c") set "MyPath=D:\Temp p" set "DestPath=D:\Temp p\1\" forfiles /P "%MyPath%" /M "*.*" /D %mydate% /C "cmd /C copy @file \"%DestPath%\"" 命令在您尝试使用时会出现问题,因为值forfiles 包含周围的@file(不幸的是)。因此(假设当前迭代的项称为""),当变量被其值替换时,路径filename.ext将看起来像%MyPath%\@file。为了解决这个问题,我添加了选项D:\Temp p\"filename.ext",因此/P "%MyPath%"forfiles指定的目录中/C切换后运行命令,因此您不需要预先{ {1}} %MyPath%但仅使用后者。

    您可能已经注意到我没有将%MyFile%放在@file附近,而是写了""。这也是%DestPath%专业,因为您需要在引用的命令行字符串(\"%DestPath%\"之后)中通过前面的forfiles转义引号。否则,/C会删除所有文字引号\

    因此forfiles执行以下命令,以便每次循环迭代执行:"(重用上面提到的示例项)。

答案 1 :(得分:0)

您应该使用双引号来查找路径:

For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%a/%%b/%%c)
set MyPath="D:\Temp p"
set DestPath="D:\Temp p\1\"
forfiles /p  "%MyPath%" /m *.* /D %mydate% /C "cmd /c copy @file \"%DestPath%"\"

这样你就可以逃避空间

答案 2 :(得分:0)

作为mabe02答案的替代方法,您还可以使用双引号来仅转义空格字符。

For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%a/%%b/%%c) set MyPath=D:\Temp" "p set DestPath=D:\Temp" "p\1\