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\
有两点我想建议你:
路径用双引号引起来!
除了SPACE之外,还有更多的字符被命令提示符视为分隔符,它们是TAB, ,
、;
、=
。如果您将 ""
一般放在所有路径周围,您就不会 运行 陷入这些字符的问题。路径中允许使用一些其他字符,并且在批处理文件中具有特殊含义(如 ^
、&
、(
、)
);使用引号时也会受到保护。
始终使用 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%"
(重复使用上述样本项)。
我想将今天创建的所有文件以批处理文件的形式从文件夹 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\
有两点我想建议你:
路径用双引号引起来!
除了SPACE之外,还有更多的字符被命令提示符视为分隔符,它们是TAB,
,
、;
、=
。如果您将""
一般放在所有路径周围,您就不会 运行 陷入这些字符的问题。路径中允许使用一些其他字符,并且在批处理文件中具有特殊含义(如^
、&
、(
、)
);使用引号时也会受到保护。始终使用
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%"
(重复使用上述样本项)。