Space in 批量复制文件的路径

Space in path for copying files in batch

我想将今天创建的所有文件以批处理文件的形式从文件夹 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\
forfiles  -m *.* /D %mydate% /C "cmd /c copy %MyPath%\@file %DestPath%"

答案是:

The system cannot find the file specified.

但是,如果我将文件夹 "Temp p" 更改为 "Temp"(我的意思是省略 space),它就可以正常工作。我应该怎么做?

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

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\"
forfiles /p  "%MyPath%" /m *.* /D %mydate% /C "cmd /c copy @file \"%DestPath%"\"

这样你就可以逃脱space

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

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. 路径用双引号引起来!

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

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

    这样引号就不会成为分配给变量的值的一部分,而是一些特殊字符,如 ^&() , <, >, | 甚至 " 都不会造成任何麻烦,并且尾随 SPACEs该命令行不会无意中成为值的一部分。另一个很大的优势是,只有当您扩展(读取)像 "%VARIABLE%" 这样的变量时,您才需要关心周围的 "",因为如上所述 "" 不包含在值中。因此,您甚至可以将变量用作 "%VARIABLE%\file.txt" 等文件路径的一部分,从而使整个路径位于 "".
    之间 请注意,此语法仅在 command extensions are enabled, but this is the default for the Windows command prompt anyway, and disabling them makes only sense when you want to execute a batch file that has been written for MS-DOS (command.com).

    时有效

所以对于你的代码部分(不检查内部函数),上面的意思是:

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\"
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 运行 在 %MyPath% 给出的目录中 /C 开关之后的命令,所以你这样做不需要将 %MyFile% 添加到 @file 之前,而是单独使用后者。

您可能已经注意到,我没有将 "" 放在 %DestPath% 周围,而是写成 \"%DestPath%\"。这也是 forfiles 的一个特点,因为您需要在 \ 之前转义引用的命令行字符串中的引号(在 /C 之后)。否则 forfiles 删除任何文字引号 ".

因此 forfiles 执行以下命令以在每次循环迭代中执行:cmd /C copy "filename.ext" "%DestPath%"(重复使用上述样本项)。