需要从批量 For 循环中排除特定结果

需要从批量 For 循环中排除特定结果

我有一个脚本,它使用 FOR 循环将文件从特定目录(和子目录)递归加载到 Java 类路径中。它看起来像这样:

/r目录%%F IN (*.jar) DO 调用:addcp %%F

不幸的是,我现在需要从结果中排除特定的子目录(我不想加载某些 jar 文件)。我尝试在 FOR 循环内嵌套 IF 语句,但没有成功。

不幸的是,更改脚本语言不是一种选择,迭代每个子目录将是一场维护噩梦。有人有办法做到这一点吗?

我尝试过类似的事情:

/r目录%%F IN ( *.jar) DO IF %%F==*字符串*DO 调用:addcp %%F

但它不起作用。

答案1

这是一段脚本,用于转储“%ProgramFiles%”下除“Windows NT”子目录中的文件之外的所有 EXE 文件的绝对路径列表。我认为您可能已经能够通过此脚本找到您想要的内容。

@echo off

for /f "usebackq delims=" %%i in (`dir "%ProgramFiles%\*.exe" /s /a /b`) do call :checkit "%%i" 
goto end

:checkit
echo %1 | find /i "%ProgramFiles%\Windows NT\" >NUL 2>NUL
if errorlevel 1 echo %~1

:end

答案2

我建议使用 find,看看 man find。例如 find "%ProgramFiles%\" -iname ".exe" !-regex "%ProgramFiles%\folder_to-exclude.$" -exec call :addcp {} \; 可能会做你想做的事。

答案3

%%F 解析为 .jar 文件的路径,而不是目录名,这就是 == 不起作用的原因。

我建议分两步进行 - 首先

dir /s /b directory\*.jar > temp.txt

进而

for /F usebackq %%I in (`findstr /V <excluded path> temp.txt`) do call :addcp %%I

findstr 的 /V 参数会打印所有与您传入的字符串不匹配的行。如果确实需要,您还可以使用通配符甚至正则表达式来排除。

相关内容