
У меня есть пакетный файл Windows, который обрабатывает кучу файлов. В качестве части этого я использую следующую строку:
forfiles /p "%~dpn1%LogDir%" /m "%SupportLog%*" /c "cmd /c logreader.py @file > \"%~dpn1%ParsedLogDir%\@file_Logreader.txt\"
Это работает нормально, но по сути перебирает все мои файлы (%SupportLog%*) и передает каждый из них по одному в скрипт «logreader.py».
На самом деле я хочу создать список или параметр всех этих файлов и передать их все сразу в скрипт Python, чтобы команда, которая должна быть запущена, выглядела примерно так:
logreader.py "logfile.log" "logfile.log.1" "logfile.log.3" .....
Я попытался использовать команду SET внутри команды forfile следующим образом:
forfiles /p "%~dpn1%LogDir%" /m "%SupportLog%*" /c "cmd /c set PARAMS=%PARAMS%@file "
Однако, если запустить это и оставить ECHO включенным, я увижу:
forfiles /p "C:\Path\log" /m "logfile.log*" /c "cmd /c set PARAMS=@file "
Что неверно. И когда я "echo %PARAMS%", я не получаю никакого результата.
Есть ли способ этого добиться?
Большое спасибо
решение1
Изменение переменных среды вребенок cmd
экземпляр (это то, что cmd /c
вызывает) не влияет на среду в родительском cmd
процессе. Следующий фрагмент кода может помочь:
SETLOCAL EnableExtensions EnableDelayedExpansion
set "LogDir=%~dpn1log" my guess only
set "SupportLog=logfile.log" my guess only
set "PARAMS=" initial value
rem 1st try for /R "%LogDir%" %%a in ("%SupportLog%*") do set PARAMS=!PARAMS! "%%~a"
rem 2nd try for %%a in ("%LogDir%\%SupportLog%*") do set "PARAMS=!PARAMS! "%%~a""
rem 3rd try
for %%a in ("%LogDir%\%SupportLog%*") do set "PARAMS=!PARAMS! "%%~nxa""
echo logreader.py %PARAMS%
Обратите внимание, что императив используется logreader.py
только echo
в целях отладки.
Однако, извините, я не понимаю, на кого направлено >
это сообщение...
Ресурсы(обязательно к прочтению):
- (справочник команд)Индекс AZ командной строки Windows CMD
- (дополнительные особенности)Синтаксис командной строки оболочки Windows CMD
- (
%~a
и т.д. специальная страница)Аргументы командной строки (параметры) - (
>>
и2>1
т.д. специальная страница)Перенаправление
Редактировать:
- 1-я попытка
for /R
рекурсивно просматривает дерево папок: отклонено; попыткаfor %%a
:условно выполнить команду для нескольких файлов; - Вторая попытка
"%%~a"
дает полное имя файла; - Третья попытка
"%%~nxa"
выдает только имя файла и расширение (без пути).