我试图制作一个简单的脚本,输出所有子文件夹的名称,除了一个。我无法进行字符串比较以删除该文件夹。
这是基本文件夹细分:
以下是90%的代码的基本示例:
ForFiles /P C:\Backup /C "CMD /C echo @FILE"
这里是这个命令的输出(引号本身就是引号):
".sync"
"folder1"
"folder2"
为了简要说明代码,基本上ForFiles将运行给定路径中的文件和子文件夹(由/P C:\Backup
指定)。 /C
然后指定一个双引号的命令 - echo @FILE
然后输出文件的名称。我运行的实际代码比这更复杂,但这足以作为显示我的问题的最小示例。我不想输出.sync文件夹的名称,因为它被其他程序使用,不应该被触及。
所以,我想做的是放一个" if"命令中的语句,以便不会输出所有内容。在伪代码中,这将是"如果文件夹的名称不是.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"
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"
任何人都可以给我一些关于如何实现这个的建议吗?谢谢!
答案 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"