我正在尝试创建一个简单的脚本,它将输出所有子文件夹的名称,除了一个。我在进行字符串比较以删除那个文件夹时遇到了问题。
下面是一个基本的文件夹分解:
下面是一个基本的代码示例,它可以工作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"
有人能给我一些关于如何解决这个问题的建议吗?谢谢!
发布于 2016-01-01 21:59:29
ForFiles /P u:\Backup /C "CMD /C echo @FILE|find /v /i "".sync"""为我工作,用我的u:驱动器。毫无疑问,它也会过滤掉*.sync* --如果这是或任何关注的话。
发布于 2016-01-02 07:07:27
要在/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命令中,以便以区分case _ in _ in的方式对文件/目录路径进行比较,因为Windows并不关心路径中的情况。
如您所见,我插入了另一条if语句:我在整个命令行前面插入了if @isdir==TRUE,以过滤掉所有文件,因为您只想输出一个文件夹(目录)列表。
发布于 2016-01-02 12:22:26
据我所知,除了.sync备份之外,您只想列出C:\Backup下的所有dirs,对吗?下面是执行此操作的代码:
dir /ad /b C:\Backup | find /V ".sync"https://stackoverflow.com/questions/34560371
复制相似问题