Как остановить ограничение поиска DIR /S после того, как он что-то нашел

Я пытаюсь найти файл на диске в BATCH, поэтому я использовал следующую команду:

DIR c:\directory\* /s/b | FIND "filename.txt"

проблема в том, что как только я нахожу файл, он все еще ищет… Поэтому мне было интересно, есть ли параметр или что-то, что остановит поиск после того, как он найдет хотя бы 1 результат.

изменить

Я пытался что-то вроде

FOR %%G IN (DIR c:\directory\* /s/b | FIND "filename.txt") DO copy %%G 

затем я бы добавил еще одну командную строку для выхода из цикла после выполнения команды копирования.


person Shikio    schedule 09.08.2011    source источник
comment
Я пробовал что-то вроде FOR %%G IN (DIR c:\directory\* /s/b | FIND "filename.txt") DO copy %%G, тогда я бы добавил еще одну командную строку для выхода из цикла после выполнения команды копирования.   -  person Shikio    schedule 09.08.2011
comment
Я добавил ваш комментарий к тексту вопроса.   -  person wimh    schedule 10.08.2011
comment
dir уже имеет возможность поиска, нет необходимости направлять вывод в find   -  person phuclv    schedule 30.08.2018


Ответы (5)


Здесь был аналогичный вопрос: Выход из цикла For - команда Windows Процессор (CMD.EXE)

А вместо: DIR c:\directory\* /s/b | FIND "filename.txt"

вы можете использовать это: DIR /s /b c:\directory\filename.txt

Результат не такой, как я ожидал... :-) Попробуйте!
(Вы также можете использовать подстановочные знаки для "filename.txt")

person Mayra    schedule 27.05.2013

Может быть какой-то хитрый трюк, например, отправка Ctrl+C в DIR после получения результата, или Windows Powershell может помочь, но я сомневаюсь в этом. Кроме того, я не знаю никаких параметров для управления количеством результатов для него, и я не думаю, что они есть.

Если вы хотите сделать что-то подобное, используйте свой любимый язык программирования и сделайте это там. Пакетные сценарии — это мощное средство, но некоторые вещи слишком сложны, а размышления о решениях просто отнимают слишком много времени.

Кстати, если вы часто выполняете такие FIND операции, я бы предложил что-то вроде этого:

 REM Script to build a filename index for all your drives

 DIR C:\* /s /b > index.txt
 DIR D:\* /s /b >> index.txt
 REM ...more drives here

 REM And you might want to compress index.txt afterwards

После этого вы можете просто FIND файлов в индексе, что намного быстрее, хотя вам, возможно, придется время от времени пересоздавать индекс.

person schnaader    schedule 09.08.2011

Единственное, что вы можете сделать, это:

DIR c:\directory* /s/b | FIND "filename.txt" | more

Таким образом, вам нужно нажать Enter, если найдено более страницы результатов. Но это не остановит dir /s, потому что вы не можете сказать ему, когда остановиться.

Изменить: Что касается вашего комментария о том, как остановить цикл for, см. ниже.

В этом примере вместо dir | find я использую Locate32. Взгляните на это, это похоже на предложение schnaader, чтобы сохранить список всех файлов в текстовом файле. Locate32 создает базу данных и может автоматически обновлять ее по расписанию. Вы можете быстро найти в базе данных.

Следующий пример ищет cmd.exe где-то ниже c:\windows. Он ищет полное имя файла, поэтому не находит appcmd.exe. из-за goto :skip он останавливается после отображения первого результата.

@echo off

FOR /f %%G IN ('"C:\Program Files\Locate\Locate.exe" -p c:\windows -lw cmd.exe') do (
  echo %%G
  goto :skip
)

:skip
echo done
person wimh    schedule 09.08.2011
comment
Я думал об использовании FOR, чтобы сделать то же самое, что может решить проблему. - person Shikio; 09.08.2011

Вы не можете ограничить цикл секундами, но сколько раз вы хотите его зациклить. Я не уверен, относится ли следующий пример к вашей конкретной проблеме, но мне нравится пугать своих друзей поддельными вирусами. Я обнаружил, что вы можете приостановить его, делая команду в блокноте. Пример: (@echo OFF echo вас взломали, реж/с пауза. Это приостанавливает один дир/с, поэтому он не находится в цикле, поэтому он одиночный, это также заставит его продолжаться в течение одной секунды (как долго реж /s в единственном числе). секунд, прежде чем он остановится. Я надеюсь, что это помогает и понятно.

person Layne    schedule 26.04.2013

Единственный известный мне способ сделать это без поиска по всему устройству перед установкой переменной — использовать PowerShell. Это могло быть не так очевидно в 2011 году, когда был задан вопрос.

Цикл cmd FOR завершит команду до выполнения блока DO. Каналы PowerShell передают данные по мере их обнаружения.

@ECHO OFF
FOR /F "delims=" %%f IN (' ^
    powershell -NoProfile -Command ^
        "Get-ChildItem -Path 'C:\' -Recurse -Filter '*testfile.jar' -ErrorAction SilentlyContinue |" ^
        "Select-Object -First 1 |" ^
        "ForEach-Object { $_.FullName }" ^
    ') DO (
    SET "FN=%%~f"
)

ECHO "%FN%"
person lit    schedule 30.08.2018