2016-01-01 54 views
0

我试图做一个简单的脚本,将输出所有子文件夹的名称,除了一个。我无法通过字符串比较来删除该文件夹。比较ForFiles的输出

这里有一个基本的文件夹细分:

  • Ç
    • 备份
      • .SYNC
      • 文件夹1
      • 文件夹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"
  • 输出的所有文件,包括。同步 - 使用^符号是转义双引号我对堆栈溢出发现的另一种方法,它似乎只有第一个实际上是被转义出于某种原因
    • ForFiles /P C:\Backup /C "CMD /C if NOT @FILE == ^".sync^" echo @FILE"

灿任何人都会给我提供一些关于如何使用acrobat来建议的建议?谢谢!

+0

不确定您为什么使用FORFILES。 FOR命令将工作得很好,运行速度会更快。 – Squashman

+0

感谢您的建议 - 幸运的是,对于我来说,并不是所有这些文件都可以通过,所以FORFILES在速度上运行良好。我使用它,因为我在这里找到了答案:http://stackoverflow.com/questions/51054/batch-file-to-delete-files-older-than-n-days - 虽然我的问题中的脚本没有提到“删除N天以前的文件”部分,这就是我最终希望我的脚本所做的事情。 – Jake

回答

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

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

+0

完美的作品!进入'发现'命令管道,并使用双引号 - 绝对不是我会尝试的。最后产生的三重双引号非常难看......但我想这就是我用批处理脚本得到的结果!非常感谢你! – Jake

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,因此它识别"

我stringly建议开关/I添加到if命令来执行的文件/目录路径的比较在敏感的方式区分,因为Windows不关心路径的情况。

正如您所看到的,我插入了另一个if语句:我在整个命令行前加上if @isdir==TRUE,以滤除所有文件,因为您只是试图输出文件夹列表(目录)。

0

我知道你只是想列出C:\ Backup下除.sync之外的所有dir,对吗?以下是执行此操作的代码:

dir /ad /b C:\Backup | find /V ".sync" 
+1

请为您的答案添加解释,以便将来的读者能够受益。 –

+0

好吧,做了,但代码只是做他要求的。解释在上面的问题中。 – Henrik

+0

为了使搜索不区分大小写,我会将'/ I'开关添加到'find',就像Windows对待路径一样...... – aschipfl