我有一个脚本,它使用 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 参数会打印所有与您传入的字符串不匹配的行。如果确实需要,您还可以使用通配符甚至正则表达式来排除。