Я думаю, что единственный безопасный способ - это установить петли для всех частей: буквы диска, папки B
(что угодно, *
) и папки C
(85*
).Самый внутренний цикл в следующем примере кода повторяется только один раз и возвращает файл, не обращаясь к файловой системе, так как нет подстановочного знака *
или ?
(это характер for
);именно поэтому используется if exist
- дважды, чтобы сопоставлять только файлы, но не каталоги (обратите внимание на конечный \
для второго, 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.
)
Эти методы могут использоваться для обоих вышеупомянутыхОн подходит вместо петли for %%A
.