所以我试图在另一个目录下执行代码,除了那些我在文本文件中列出的目录。因此,例如,如果我想直接在C:\中运行所有目录上的代码,但不要说C:\ avoidme \我会在exclusions.txt中添加C:\ avoidme作为一行。但是我下面的代码似乎没有用。关于如何做到这一点的任何想法?
for /f %%d in ('dir /b C:\') do (
find /c "C:\%%d" exclusions.txt
if %errorlevel% equ 1 (
Do code here
)
答案 0 :(得分:2)
@echo off for /D %%d in (*) do ( %WINDIR%\system32\find "%%d" exclude.list >nul if errorlevel 1 ( echo good %%d ) else ( echo bad %%d ) )
答案 1 :(得分:1)
您的代码不起作用的原因是因为在实际执行FOR语句之前,会立即解析FOR DO()子句的整个主体。但%ERRORLEVEL%的值在解析时扩展,因此您永远不会在执行时看到更新的值。
您还有其他问题
您应该使用DIR / AD选项将列表限制为仅限目录
您对查看FIND命令的输出不感兴趣,因此您可能应该将输出重定向到nul
givendkoa有一个可行的解决方案。
另一种选择是使用延迟扩展
setlocal enableDelayedExpansion
for /f %%d in ('dir /ad /b C:\') do (
find /c "C:\%%d" exclusions.txt >nul
if !errorlevel! equ 1 (
REM Do code here
)
)
如果它包含!
,则%% d会在扩展时破坏该值。这可以通过在循环内切换延迟扩展来解决。
另一种方法是使用||
运算符,这意味着如果上一个命令失败,则执行以下命令。
for /f %%d in ('dir /ad /b C:\') do (
find /c "C:\%%d" exclusions.txt >nul || (
REM Do code here
)
)
也许最好的选择是通过使用/ V和/ G:选项直接将DIR的结果直接传递给FINDSTR,以消除排除列表中出现的值,从而无需担心错误级别。
以下是可行的
for /f %%d in ('dir /ad /b C:\ ^| findstr /l /v /g:"exclude.list"') do (
REM - Do code here
)
但是 - 如果你搜索不同长度的多个文字字符串,会有一个令人讨厌的FINDSTR错误导致它失败。
修复方法是强制FINDSTR使用正则表达式,但是您需要转义可能出现在排除列表中的任何正则表达式元字符。例如,名为myName.ext
的目录必须转义为myName\.ext
。
for /f %%d in ('dir /ad /b C:\ ^| findstr /r /v /g:"exclude.list"') do (
REM - Do code here
)
其他需要在exclusion.list中转义的字符包括\
,^
,$
,[
,]