使用FORFILES批量移动30天的文件夹

我目前正在工作,只从一个目录到文件夹的文件夹。 我创build的当前bacth文件如下。

Set /p target=Select Target Destination: ForFiles /P "C:\Batch test" /D -4 /C "CMD /C if @ISDIR==TRUE echo Move @FILE %target%" &Move @File %target% pause 

我遇到的问题是使用一个目标目录中有一个空间,例如“C:\ Move Test”。 我想知道是否有办法将文件夹移动到名称中有空格的另一个目录。

您可以用它们的十六进制等同于0x22替换双引号:

 ForFiles /P "C:\Batch test" /D -4 /C "CMD /C if @ISDIR==TRUE (echo Move @FILE 0x22%target%0x22 & Move @File 0x22%target%0x22)" 

如果您遇到其他字符问题,您也可以替换它们; 0x26 = &,0x28 = (,0x29 =

你的命令行看起来很奇怪,有几个错误:

 ForFiles /P "C:\Batch test" /D -4 /C "CMD /C if @ISDIR==TRUE echo Move @FILE %target%" &Move @File %target% 

哪里不对:

  • 你说的是30天左右,但你指定/D -4 ,虽然/D -30是正确的; 注意/D检查最后修改日期 ,而不是创建日期!
  • (第一个) move命令前有一个echo ,所以move命令显示而不是执行; 为了避免这一点,只需删除echo ;
  • forfiles 之后还有第二个move命令,因为它出现在forfiles /C部分的后面,而在forfiles /C连接操作符&后面。 这完全超出了forfiles的范围,因此@file被逐字处理; &符号和孤立move命令需要被删除;
  • 回答你的实际问题 :避免出现在文件/目录路径中的空格(或其他特殊字符)问题,在它们周围加引号; 但是 :由于该部分出现在已经引用的forfiles /C之后的命令字符串中,因此不能简单地使用"" ,您需要将其转义; 在forfiles有两个选项:1.使用“ \"和2.使用0x22 (根据forfiles /?帮助,您可以通过十六进制代码指定字符,格式为0xHH ,代码0x22代表一个"字符”)。 我强烈推荐选项2.因为在变体1中,仍然出现"可能影响命令解释器cmd字符,因为它不熟悉\"转义(转义字符是^ );

因此,正确的命令行如下所示:

 ForFiles /P "C:\Batch test" /D -30 /C "CMD /C if @ISDIR==TRUE Move @FILE 0x22%target%0x22" 

为了完整起见,这是选项1的样子:

 ForFiles /P "C:\Batch test" /D -30 /C "CMD /C if @ISDIR==TRUE Move @FILE \"%target%\"" 

请注意,您不需要在此引用源代码,因为@FILE (如所有与路径相关的@样式变量)展开为已引用的字符串。