Найти файл под частично известным путем к папке - PullRequest
0 голосов
/ 24 мая 2018

Я очень плохо знаком с пакетными файлами.Я пытаюсь написать скрипт для поиска этого файла:

A\Org\App\B\C\SQL Scripts\Miscellaneous\CRErrorFinder.exe

Где:

  • A - это любой диск
    Пример значения C:
  • B имя папки
    Пример значения TEST
  • C имя папки , которое должно начинаться с известного номера, например 85.
    Пример значения850-0

То, что я пробовал:

Я могу циклически перемещаться по дискам, чтобы получить свою корневую папку поиска, (что-то вроде C:\Org\App\ или D:\Org\App\) , а затем используйте еще две петли для B и C.Но есть ли более короткий способ добиться того, что я здесь делаю?

1 Ответ

0 голосов
/ 25 мая 2018

Я думаю, что единственный безопасный способ - это установить петли для всех частей: буквы диска, папки 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 следующим образом:

  1. Все диски, включая сетевые диски и т. П., Установленные 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.
    )
    
  2. Только локальные диски:

    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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...