我想在批处理文件中将今天创建的所有文件从文件夹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"到"临时" (我的意思是省略空间)它工作正常。我该怎么做?
答案 0 :(得分:2)
有两件事我想建议你:
用成对的引号括起路径!
除了 SPACE 之外,还有更多字符被命令提示符视为分隔符,它们是 TAB ,,
,;
, =
。如果你将""
放在所有路径上,那么你就不会遇到这些字符的问题。路径中允许使用其他一些字符,这些字符在批处理文件中具有特殊含义(例如^
,&
,(
,)
);使用引号时也会受到保护。
始终使用set
语法set "VARIABLE=Value"
!
这样,引号不会成为分配给变量的值的一部分,而是一些特殊字符,如^
,&
,(
,)
,{ {1}},<
,>
甚至|
不会造成任何麻烦,并且在该命令行尾随 SPACE 不会成为价值无意中。另一个很大的好处是,只有在展开(读取)"
之类的变量时才需要关注周围""
,因为前面提到的"%VARIABLE%"
不包含在值中。因此,您甚至可以将变量用作""
等文件路径的一部分,以使整个路径位于"%VARIABLE%\file.txt"
之间。
请注意,此语法仅在启用command extensions时有效,但这仍然是Windows命令提示符的默认语法,只有当您要执行为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\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\