Как я могу искать файлы рекурсивно, но работать только в тех случаях, когда файл найден с использованием командного файла? - PullRequest
0 голосов
/ 06 июня 2018

Цель моего сценария - найти одно имя файла (среди которых есть файлы с таким именем, которые существуют в разных папках) рекурсивно по начальному пути и вывести путь каждого найденного файла, исключая имя и расширение.

Я застрял на этом все утро по какой-то причине.Я создал приведенный ниже код.

@echo off

for /r D:\Workspaces\fwarrener-lglesias\Example\Example\Clients %%x in (EnterpriseSettings.config) do (
    echo %%~nxx
    echo %%~dpx
)

Из ответов и документации других людей у ​​меня сложилось впечатление, что команды будут выполняться в предложении 'do' только в том случае, если найден файл в скобках.Однако при выполнении и передаче в файл у меня смешное количество ненужных строк, поскольку он выводит каталог, в котором он находится, даже если он не нашел файл.Я смущен этим, так как думал, что весь смысл задания набора заключается в том, что команды at будут выполняться только в том случае, когда он находит имя файла.

D:\Workspaces\fwarrener-lglesias\Example\Example\Clients\Example\
D:\Workspaces\fwarrener-lglesias\Example\Example\Clients\Example\Example\
D:\Workspaces\fwarrener-lglesias\Example\Example\Clients\Example\Example\Config\
D:\Workspaces\fwarrener-lglesias\Example\Example\Clients\Example\Example\Config\Stage\

Может ли кто-нибудь разъяснить мне, какЯ неверно истолковал использование цикла for или синтаксиса?

Ответы [ 4 ]

0 голосов
/ 06 июня 2018

Как уже показал этот ответ , использование команды dir является хорошим решением, которое я бы предпочел.

Альтернативный способ - использовать for /R, как вы ужесделать, но добавить if exist, например:

for /R "D:\Workspaces\fwarrener-lglesias\Example\Example\Clients" %%x in ("EnterpriseSettings.config") do (
    if exist "%%~x" if not exist "%%~x\" (
        echo %%~nxx
        echo %%~dpx
    )
)

if not exist часть с элементом плюс конечный \ исключает каталоги с совпадающими именами.

Другой способ заключается вдобавьте подстановочный знак (в этом примере ?), чтобы for получил доступ к файловой системе и проверил совпадения файлов, но отфильтровал результат от ложных срабатываний:

for /R "D:\Workspaces\fwarrener-lglesias\Example\Example\Clients" %%x in ("EnterpriseSettings?.config") do (
    if /I "%%~nxx"=="EnterpriseSettings.config" (
        echo %%~nxx
        echo %%~dpx
    )
)
0 голосов
/ 06 июня 2018

Мне кажется более очевидным сделать это с помощью команды DIR.Смотрите значение /A:-D-S-L в выводе команды DIR /?.

FOR /F "tokens=*" %%x IN ('DIR /S /B /A:-D-S-L "D:\Workspaces\fwarrener-lglesias\Example\Example\Clients\EnterpriseSettings.config"') DO (
    echo "%%~nxx"
    echo "%%~dpx"
)
0 голосов
/ 06 июня 2018

Проблема с вашим кодом более чем вероятна, потому что For /R, For /D) , ожидайте шаблон подстановочного знака.

Это можно исправить с помощью:

  • с использованием подстановочного знака *, ("EnterpriseSettings.conf*g")
  • с использованием ? wldcard ("EnterpriseSettings.c?nfig")
    Однако следует отметить, что существует потенциальная возможностьчто необязательные файлы также могут быть сопоставлены даже при тщательном размещении подстановочного знака.
  • используйте другой метод, например команды Dir или Where с их рекурсивными параметрами.
    Это должно соответствовать только точным именам файлов, пример ниже .

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion

Set "dirBase=D:\Workspaces\fwarrener-lglesias\Example\Example\Clients"
Set "fileName=EnterpriseSettings.config"

If /I Not "%__CD__%"=="%dirBase%\" (
    PushD "%dirBase%" 2>Nul && (Set "_=$") || Exit /B
)

For /F "Delims=" %%A In ('Dir /B/S/A-D-S-L "%fileName%" 2^>Nul') Do Echo %%~dpA
Pause

If "%_%"=="$" PopD
EndLocal
0 голосов
/ 06 июня 2018

Я обновил свой пакетный скрипт.

Скажите, поможет ли это вам каким-либо образом:


@ECHO OFF

SET path=C:\Users\<USER>\<DIRS>
SET filename=EnterpriseSettings*.config

For /R %path% %%f in (%filename%) do (
    echo %%~pf
)

PAUSE

Я также использовал ~p идиома, которая Extract the path onlyнаходится по адресу: Анализ имени файла в пакетном файле и другие идиомы

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