比较ForFiles的输出

时间:2016-01-01 21:45:59

标签: batch-file for-loop cmd

我试图制作一个简单的脚本,输出所有子文件夹的名称,除了一个。我无法进行字符串比较以删除该文件夹。

这是基本文件夹细分:

  • Ç
    • 备份
      • .SYNC
      • folder1中
      • 文件夹2

以下是90%的代码的基本示例:

ForFiles /P C:\Backup /C "CMD /C echo @FILE"

这里是这个命令的输出(引号本身就是引号):

".sync"
"folder1"
"folder2"

为了简要说明代码,基本上ForFiles将运行给定路径中的文件和子文件夹(由/P C:\Backup指定)。 /C然后指定一个双引号的命令 - echo @FILE然后输出文件的名称。我运行的实际代码比这更复杂,但这足以作为显示我的问题的最小示例。我不想输出.sync文件夹的名称,因为它被其他程序使用,不应该被触及。

所以,我想做的是放一个" if"命令中的语句,以便不会输出所有内容。在伪代码中,这将是"如果文件夹的名称不是.sync,则输出文件夹的名称"。然而,由于引号,这似乎更复杂,我想我必须逃避 - 但我没有任何运气。以下是我尝试过的一些事情:

  • 输出所有文件,包括.sync:
    • ForFiles /P C:\Backup /C "CMD /C if NOT @FILE == .sync echo @FILE"
    • ForFiles /P C:\Backup /C "CMD /C if NOT @FILE == ".sync" echo @FILE"
    • ForFiles /P C:\Backup /C "CMD /C if NOT @FILE == '.sync' echo @FILE"
  • 由于双引号引起错误(在Stack Overflow上找到一种转义双引号的方法)
    • ForFiles /P C:\Backup /C "CMD /C if NOT @FILE == "".sync"" echo @FILE"
  • 输出所有文件,包括.sync - 使用^符号是我在Stack Overflow上找到的双引号转义的另一种方法,看起来只有第一个实际上由于某种原因被转义了
    • ForFiles /P C:\Backup /C "CMD /C if NOT @FILE == ^".sync^" echo @FILE"

任何人都可以给我一些关于如何实现这个的建议吗?谢谢!

3 个答案:

答案 0 :(得分:1)

ForFiles /P u:\Backup /C "CMD /C echo @FILE|find /v /i "".sync"""

使用我的u:drive为我工作。毫无疑问,它也会过滤掉*.sync* - 如果这样或任何问题。

答案 1 :(得分:0)

要在/C forfiles切换后转义命令中的双引号,您有两种可能:

forfiles /P "C:\Backup" /C "CMD /C if @isdir==TRUE if /I not @file==\".sync\" echo @file"

forfiles /P "C:\Backup" /C "CMD /C if @isdir==TRUE if /I not @file==0x22.sync0x22 echo @file"

第一种变体可能更为明显,但文献记载不足。

第二个变体使用"的十六进制字符代码。虽然这可能更难以阅读,但我推荐这种方法,因为它隐藏了命令解释器cmd的嵌套引号; \"变体可能会混淆cmd,因为\转义适用于forfiles但不适用于cmd,因此它会识别"

我强烈建议将/I添加到if命令,以便以 敏感的方式比较文件/目录路径,因为Windows确实如此不关心路径中的情况。

正如您所看到的,我已插入另一个if语句:我在整个命令行之前使用if @isdir==TRUE来过滤掉所有文件,因为您尝试输出文件夹列表(目录)仅

答案 2 :(得分:0)

据我所知,您只想在C:\ Backup下列出除.sync之外的所有目录,我是对的吗?这是代码:

dir /ad /b C:\Backup | find /V ".sync"
相关问题