Как findstr "^" соответствует пустому каталогу? - PullRequest
2 голосов
/ 26 мая 2019

Пакетные файлы в Windows могут сбивать с толку в лучшие времена. Как работает

  findstr "^"

равнозначно поиску пустой папки, когда ^ означает начало строки?

for /d /r %1 %%A in (.) do (
  dir /ad /b "%%~fA" 2>nul | findstr "^" >nul || echo %%~fA
)

взято из ответа Дбенхэма

Если я не читаю это неправильно, и это

dir /ad /b "%%~fA" 2>nul

, который находит пустые папки.

Ответы [ 2 ]

3 голосов
/ 27 мая 2019

Этот скрипт получит список каталогов (и их подкаталогов), пройдется по каждому каталогу для проверки подкаталогов, а затем выведет список только тех имен каталогов, которые не содержат подкаталог.Исходный скрипт в указанной ссылке работает аналогично, за исключением того, что он будет содержать только полностью пустых каталогов (не содержащих подкаталоги или файлов).Вот разбивка каждого раздела кода:


В вашем примере for /d получает рекурсивный список каталогов:

for /d /r %1 %%A in (.) do ( )
  • для / d проходит через указанный набор каталогов
  • для / d / r сообщает циклу for, что его необходимо выполнить вподкаталоги
  • % 1 - это необязательный путь к файлу, указанный в командной строке
  • %% A будет возвращать текущий каталог в каждом цикле
  • in (SET) указывает каталог, установленный для циклического переключения
  • Указание " in (.) " указывает for циклически проходить по всем каталогам

Код внутри вашего цикла for затем проверяет каждый каталог на предмет его пустоты *:

  dir /ad /b "%%~fA" 2>nul | findstr "^" >nul || echo %%~fA
  • dir/ ad / b "PATH" получает список подкаталогов по указанному пути *
  • " %% ~ fA "расширяет имя текущего каталога до полного пути
  • 2> nul скрывает любые dir ошибки путем перенаправления STDERR на nul
  • | передает список подкаталогов, найденных dir в findstr
  • findstr "^" , затем проверяет непустой список подкаталогов
  • > nul скрывает результаты findstr, перенаправляя весь вывод на nul
  • || запускикоманда, если предыдущая команда завершилась неудачно (без findstr результатов)
  • echo %% ~ fA возвращает имя каталога, если подкаталоги не найдены *

* Обратите внимание : как указано LotPings , код, который вы предоставили, даст результаты, отличные от приведенного в примере.dir /a /b перечисляет все файлы и каталоги, в то время как dir /ad /b перечисляет только каталоги.Это означает, что ваш скрипт выведет список всех каталогов, не содержащих подкаталог (но которые могут все еще содержать файлы).Если это было ожидаемое поведение, пожалуйста, не обращайте внимания на это примечание.

Редактировать: далее разбил приведенный выше список команд, как предложено Бен Фойгт .

2 голосов
/ 27 мая 2019

Я полагаю, что вы упускаете часть операции || (логическое ИЛИ).

Команда запускается после нее только в случае сбоя предыдущей команды.

Зная это, будет иметь смысл, что dir /ad /b "%%~fA" 2>nul | findstr "^" >nul не ищет пустые каталоги. Это успешно, когда список, сгенерированный dir, НЕ пуст. Сбой, когда список пуст.

...