批处理脚本:排除集

问题描述:

我想做的事的东西线文件:批处理脚本:排除集

for %%i not in (*.xml *.doc) do .... 

显然,这是行不通的。有没有办法在批处理文件中做类似的事情?

for /f "eol=: delims=" %%i in ('dir /b /a-d *^|findstr /live ".bat .txt"') do ... 

附录

如果目录列表变得庞大这一解决方案将在一个非线性的方式减缓。这对于单个目录来说不太可能是个问题,但如果使用DIR/S选项,则很容易成为问题。通过使用临时文件,该解决方案可以恢复为相对于列表大小具有线性响应时间。

set temp1="%temp%\dirExclude1_%random%.txt" 
set temp2="%temp%\dirExclude2_%random%.txt" 
>%temp1% dir /s /b /a-d * 
>%temp2% findstr /live ".bat .txt" %temp1% 
for /f "usebackq eol=: delims=" %%i in (%temp2%) do ... 
del %temp1% 
del %temp2% 

这是Windows管道的一般限制。对于大量数据,它们效率很低。处理大量数据时,使用临时文件而不是管道总是快得多。

+0

是的,这绝对有效,而且比建议的替代品简单得多!但它是如何工作的?我已经想出了大部分,但*^|对我来说是新的。 – skittleys 2012-04-12 05:00:33

+0

^|只是一个逃跑的管道。 Findstr是WinXP +,如果这很重要的话...... – Anders 2012-04-12 05:10:18

+0

如果你有很多文件和速度问题,Aacini的解决方案可能会更快(我没有测量,但是退出是昂贵的) – Anders 2012-04-12 05:14:26

@echo off 
setlocal EnableDelayedExpansion 
rem Build a list of files to exclude 
set exclude= 
for %%i in (*.xml *.doc) do set "exclude=!exclude!%%i*" 
rem Process all but excluded files 
for %%i in (*.*) do (
    if "!exclude!" equ "!exclude:%%i*=!" echo Process this one: %%i 
) 
+0

1)我相信你打算在你的IF语句中使用'“!exclude:。%% i。=!”'。 2)如果文件名包含'=',则不能正常工作。 3)如果''a.txt''和''a.txt.doc''存在,则问题很简单 - 只需使用'*'作为分隔符而不是''',因为'*'不能存在于文件名或路径中。 – dbenham 2012-04-12 02:48:38

+0

@dbenham:你说得对!问题1和问题3修正:) – Aacini 2012-04-12 03:15:06

+1

我的错误应该使用'?'而不是'*'或'.'。初始化'set exclude =?',并在IF中使用'!exclude:?%% i?=!'。另一种方法是使用':'作为分隔符,但如果在'%% i'中使用了完整路径的FOR/R选项,则可能会导致问题。 – dbenham 2012-04-12 03:24:08