我是批处理文件的新手。我正在尝试编写一个脚本来查找此文件:
A\Org\App\B\C\SQL Scripts\Miscellaneous\CRErrorFinder.exe
其中:
A
是任何驱动器的示例值C:
B
文件夹名称TEST
C
文件夹名称,应从已知号码开始,例如85。例值850-0
我尝试了什么:
我可以遍历驱动器以获取我的根搜索文件夹(类似C:\Org\App\
或D:\Org\App\
),然后为{{1}使用另外两个循环}和B
。但有没有更短的方法来实现我在这里做的事情?
答案 0 :(得分:1)
我认为唯一安全的方法是为所有部分建立循环:驱动器号,文件夹B
(任何内容,*
)和文件夹C
({{1 }})。以下代码示例中的最内层循环仅迭代一次并返回文件而不访问文件系统,因为没有通配符85*
或*
(这是?
的性质) ;这就是使用for
的原因 - 为了匹配文件而不是匹配目录两次(请注意第二个跟踪if exist
,文件夹不符合\
):< / p>
not
找到的路径只是回显。
使用for %%A in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
for /D %%B in ("%%A:\Org\App\*") do (
for /D %%C in ("%%~B\85*") do (
for %%D in ("%%~C\SQL Scripts\Miscellaneous\CRErrorFinder.exe") do (
if exist "%%~D" if not exist "%%~D\" (
echo(%%~D
)
)
)
)
)
和dir /S
可能有另一种方式,但您仍需要遍历驱动器号:
findstr
请注意,for %%A in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
dir /B /S /A:-D "%%A:\CRErrorFinder.exe" | findstr /R /I /X /C:".:\\Org\\App\\[^\\][^\\]*\\85[^\\]*\\SQL Scripts\\Miscellaneous\\CRErrorFinder\.exe"
)
表示任何字符,.
是文字\\
,\
是除[^\\]
以外的字符,\
表示前一个表达式为零次或多次,*
为文字\.
。
您可以通过.
收集系统中实际可用的驱动器,而不是通过字母表循环,并按wmic
捕获它们:
所有驱动器,包括for /F
建立的网络驱动器:
subst
仅限本地驱动器:
for /F "skip=1" %%A in ('wmic LogicalDisk get DeviceID') do for /F "delims=:" %%A in ("%%A") do (
rem %%A holds the pure drive letter.
)
或(快一点):
for /F "skip=1" %%A in ('wmic Volume where "DriveLetter is not Null" get DriveLetter') do for /F "delims=:" %%A in ("%%A") do (
rem %%A holds the pure drive letter.
)
这些方法可用于上述两种方法,而不是for /F "delims=:\ " %%A in ('mountvol ^| find ":\"') do (
rem %%A holds the pure drive letter.
)
循环。