Пакетный поиск файлов для нескольких форматов файлов в цикле FOR - PullRequest
0 голосов
/ 07 июня 2019

Я кодирую пакетный файл, который должен искать два пути к папкам для нескольких расширений файлов и перечислять их в текстовом файле.В настоящее время я пытаюсь использовать цикл FOR со списком расширений файлов (* .doc, * .docx и т. Д.).Я полагаю, что файл содержит ошибку из-за символа "*", но я не знаю, как это исправить.

Я пытался их перечислить: FOR %%G IN (*.one,*.mht,*.onepkg).Я пробовал кавычки: FOR %%G IN ("*.one","*.mht","*.onepkg").Я пробовал знаки: FOR %%G IN (^^*.one,^^*.mht,^^*.onepkg).

Вот мой код:

set outputfilepath=d:\output.txt

FOR %%G IN ("*.one","*.mht","*.onepkg") DO (
echo Searching for %%G files
dir "C:\%%G" /s /b >> "%outputfilepath%"
Rem Add 2 blank lines between next search
echo. >> "%outputfilepath%"
echo. >> "%outputfilepath%" )

Ничего не выводится в мой текстовый файл.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Мне действительно нравятся существующие предложения, но это другой подход. Я считаю, что этот стиль читается как код.

Это может показаться очень сложным , но ...

  1. Этот метод может использоваться для циклического перебора параметров для НИЧЕГО для включения параметров, передаваемых через командную строку.
  2. Логика зацикливания переданных параметров изолирована от своей собственной функции (enumerate_search_types).
  3. Логика того, что вы собираетесь делать с каждым параметром, изолирована от его собственной функции (search_for_search_type).

Для некоторых это может быть проще, для других - слишком сложно.

@echo off

:: The parameters we are working with...
set outputfilepath=d:\output.txt
set starting_path=c:\
set search_types="*.one" "*.mht" "*.onepkg"

pushd "%starting_path%"
call :enumerate_search_types %search_types%
popd
goto :EOF

:: ---------------------------------------------------------------
:enumerate_search_types
set "current_param=%~1"
if "%current_param%"=="" goto :EOF
call :search_for_search_type "%current_param%"
shift /1
goto :enumerate_search_types

:: ---------------------------------------------------------------
:search_for_search_type
set "current_search_type=%1"
set "had_output=false"

echo Searching for %current_search_type% files
for /f "delims=" %%f in ('dir /s /b %current_search_type% 2^>NUL') do set had_output=true&& echo %%f >> "%outputfilepath%"

:: If the dir command didn't produce anything, don't add the blank lines
if "false"=="%had_output%" goto :EOF
echo. >> "%outputfilepath%"
echo. >> "%outputfilepath%"
goto :EOF
0 голосов
/ 07 июня 2019
@ECHO Off
SETLOCAL
set "outputfilepath=u:\output.txt"

(
FOR %%G IN (one,mht,onepkg) DO (
 echo Searching for %%G files>con
 dir ".\*.%%G" /s /b |FINDSTR /i /e /L ".%%G"
 Rem Add 2 blank lines between next search
 echo. 
 echo.  
)
)> "%outputfilepath%"

GOTO :EOF

Обратите внимание, что я изменил отталкивающиеся имена для соответствия моей системе.

просто для мета в списке расширений , затем добавьте * в команду dir.Отфильтруйте вывод dir, используя findstr, чтобы убедиться, что отображаются только имена, соответствующие /e в конце /L литерал ".%%G".

Также, заключив в скобки команду enitre for, вы можете отправить в файл весь текст stdout (который обычно отображается на консоли).> естественно означает создание-файл-заново.>> для добавления, если вы предпочитаете.

>con, добавленный к Searching... echo, переопределяет перенаправление и, в частности, отправляет текст с этого echo на консоль.

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