Как остановить лимит поиска DIR / S после того, как он что-то нашел - PullRequest
1 голос
/ 09 августа 2011

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

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

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

редактировать

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

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

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

Ответы [ 5 ]

1 голос
/ 27 мая 2013

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

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

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

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

0 голосов
/ 30 августа 2018

Единственный способ, которым я знаю, сделать это без поиска по всему устройству до установки переменной, это использовать 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%"
0 голосов
/ 09 августа 2011

Может быть какая-то хитрая уловка, такая как отправка 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 файлы в индексе, что на намного быстрее, хотя вам, возможно, придется время от времени пересоздавать индекс.

0 голосов
/ 26 апреля 2013

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

0 голосов
/ 09 августа 2011

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

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

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

edit: Относительно вашего комментария, как остановить цикл 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...