Вы можете использовать for /R /D
рекурсивно пройти через все каталоги, а затем использовать dir /B /A:-D /O:-D
возвращать список файлов, отсортированных по дате (сначала новые) и разобрать его выход на for /F
принимать только первый элемент, поэтому перечислим только один новейший файл в каждом каталоге:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
> "C:\results.txt" (
for /D /R %%D in ("C:\srm2\reg\*.*") do (
call :SUB FILE LINE "%%~fD\*.cpf" "ProjectVersion"
if defined LINE (
echo/!FILE!:!LINE!
)
)
)
endlocal
exit /B
:SUB var_file var_line pattern string
set "%~1=" & set "%~2="
for /F "eol=| delims=" %%F in ('dir /B /A:-D /O:-D "%~3"') do (
set "%~1=%%~fF"
for /F "delims=" %%L in ('findstr /L "%~4" "%%~fF"') do (
set "%~2=%%L"
goto :EOF
)
goto :EOF
)
Давайте посмотрим на подпрограмму :SUB
первый, который предназначен для выполнения один раз в каждом каталоге. Это требует 4 параметра:
- (
%~1
) имя переменной провести путь к найденному файлу,
- (
%~2
) имя переменной провести линию, соответствующую строку поиска,
- (
%~3
) шаблон, чтобы получить отсортированный список файлов (сперва сначала) и
- (
%~4
) строка поиска (ожидается, что она будет не более одного раза на файл).
Внешний for /F
цикл разбирает вывод команды dir /B /A:-D /O:-D "%~3"
, который фактически строит упорядоченный список файлов. Цикл требует итерации по каждой отдельной строке, но поскольку в конце есть goto :EOF
, цикл прерывается после первой итерации, поэтому обрабатывается только первый (и, следовательно, самый новый) элемент списка. Путь к этому элементу присваивается первой переменной, заданной в качестве аргумента. Если элементы не соответствуют шаблону файла, переменная остается пустой.
Внутренняя петля for /F
анализирует выход команды поиска findstr
. Так как ожидается только одно вхождение поисковой строки, этот цикл должен повторяться только один раз. Если совпадение найдено, содержащая строка присваивается второй переменной, заданной в качестве аргумента. Если совпадение не найдено, переменная остается пустой.
Теперь давайте рассмотрим основную рутину. Это рекурсивно проходит через дерево каталогов, используя for /D /R
и выполняет итерацию по всем каталогам. Для каждого из них, подпрограмма :SUB
называется, проходя через следующие аргументы:
- имя переменной
FILE
(получит новейший файл в настоящее время itereted каталога),
- имя переменной
LINE
(получит линию файл, который соответствует строке поиска),
- в данный момент итерацию каталог с файлом шаблона
reg*.cpf
дописывается, и
- требуемая строка поиска
ProjectVersion
.
Наконец, переменная LINE
проверяется на пустоту, и если нет, то строка, содержащая путь к файлу, двоеточие и найденную строку выводится echo
.
Обратите внимание, что все выходные данные перенаправляются в файл C:\results.txt
.
Этот подход с использованием подпрограммы был выбран, поскольку существует команда goto
, используемая для завершения одного определенного цикла for
при его первой итерации (см. Описание выше), но не все из них. goto
фактически разбивает все контексты блоков, в которые он помещается, даже все вложенные. for
Петли - всего лишь своего рода команда блока, например, if
, или просто сгруппированные команды ()
. Использование подпрограммы предотвращает разбиение блоков основной процедуры на goto
, помещенных в подпрограмму.
Пожалуйста, сообщите нам, что вы пробовали до сих пор, редактируя сообщение! – aschipfl