2016-06-07 95 views
0

我正在编写批处理以在当前目录中的所有目录上运行命令。.bat - 如何从目录命令中删除“dot”和“dot dot”项目

要开始,我做dir /A:D,但即使在...目录上,我不想运行我的命令。

我知道我可以写

IF NOT %%x EQU "." 
    IF NOT %%x EQU ".." 

排除它们但是,有没有更通用的方法?像:

set EXCLUDED=".","..","bob" 
set FOLDERS=dir /A:D 
rem for each in EXCLUDED, remove from FOLDERS 
rem run my command(s) on FOLDERS 

回答

2

您可以添加/b开关排除...,只要你不需要通过dir /a:d提供的其他信息。

要排除其他目录,使用find /v这样的:

dir /a:d /b | find /v "bob" | find /v "alice" 

/v开关将输出一切,但给定行。

+0

是否有解决方案,就像我的问题一样,您可以提供一个包含要排除的项目列表的VAR?这将是最通用的解决方案。 – Adrian

+1

@Adrian您可以使用'findstr/v'来处理不符合正则表达式的行,并将变量设置为要排除的正则表达式。 'findstr'语法将空格视为多个搜索项的分隔符。例如,'set'excluded = intel link logitech“'then'dir/b/a:d |” findstr/i/v“%excluded%”将匹配除Intel,Links或Logitech以外的所有目录(不区分大小写)。或者如果您打算采取的行动可以通过'robocopy'处理,您可以使用'robocopy'的'/ XD'开关来排除您指定的目录。或者如果'xcopy',你可以使用它的'/ exclude'开关。 – rojo

+0

@rojo ok听起来像我想要的。一旦我编辑它并粘贴你在评论部分写的内容,我会接受你的回答。 – Adrian

0

显然,您使用for循环(可能是for /f "..." %%x in ('dir ...') do ...)。有一个特殊的参数/D使用目录的工作:

@echo off 
setlocal EnableDelayedExpansion 
FOR /D %%x IN (*) do (
    ECHO %%x|FINDSTR /ivx "bob joe jane">nul && (
    ECHO do stuff with %%x 
) || (
    ECHO skipping %%x 
) 
) 

(工程,只要有在“排除”文件夹名称中没有空格)

PS:没有必要排除...这里,因为for /d不显示它们。