Перетащите несколько файлов, чтобы использовать анализатор журнала - PullRequest
1 голос
/ 20 июня 2019

Моя проблема проста, я хочу запустить парсер журналов в пакетном режиме, однако у меня нет опыта работы с несколькими файлами или папками.

Я собирал этот код и до сих пор получил это:

echo %1
SETLOCAL ENABLEDELAYEDEXPANSION
set INPUTDIR=%~dp0\
set OUTPUTDIR=%INPUTDIR%ParseOutput\
For %%A in (%*) do (
    Set Folder=%%~dpA
    Set Name=%%~nxA
    GO TO PROCESS
)

ECHO %Name%
:PROCESS
set INPUTFILE=%Name%
set OUTPUTFILE=%Name%parsed.txt
set OUTPUTTARGET=%OUTPUTDIR%%OUTPUTFILE%
set INPUTTARGET=%INPUTDIR%%INPUTFILE%

logparser "SELECT DISTINCT date, time, X-Forwarded-For,cs-username, sc-status INTO %OUTPUTTARGET% FROM %INPUTTARGET%" -i:W3C -o:W3C

PAUSE

exit /B

Что я хочу получить, так это то, что если я перетащу несколько файлов, они выведут проанализированные файлы, по одному для каждого входного файла.Тем не менее, если я поставлю только один файл, все в порядке, но если я поставлю несколько файлов, он просто делает первый.Я знаю, что моя ошибка в: process, но как мне вернуться из: process обратно в цикл и продолжить с того места, где я ушел?

1 Ответ

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

Путь к папке пакетного файла, на который ссылается %~dp0, всегда заканчивается \. Поэтому после %~dp0 независимо от того, где %~dp0 используется в пакетном файле, не должно быть обратной косой черты.

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

Ответ на Почему нет строкового вывода с 'echo% var%' после использования 'set var = text' в командной строке? объясняет причины использования синтаксиса set "variable=value" при присвоении строкового значения к переменной среды. Имена файлов и папок могут содержать символы со специальным значением в пакетных файлах, например пробел, или один из этих символов &()[]{}^=;!'+,`~, для которого требуется заключить строки файла / папки в ", чтобы эти символы интерпретировались буквально командным процессором Windows. Запустите в окне командной строки cmd /? и прочитайте справку по выводу, особенно последний раздел на последней странице справки по выводу.

GO TO не является допустимой командой. Это можно увидеть в при отладке пакетного файла , выполнив его из окна командной строки, чтобы увидеть вывод сообщения об ошибке при cmd.exe обработке пакетного сценария. Можно запустить в окне командной строки help, чтобы отобразить список Команды Windows с кратким описанием каждой команды. Все внутренние команды cmd.exe и большинство внешних команд (* .com или * .exe в %SystemRoot%\System32) могут быть выполнены в окне командной строки с /? в качестве аргумента для отображения справки для этой команды. Подробнее о командах Windows можно прочитать по адресу SS64.com - индекс A-Z командной строки Windows CMD .

Использование правильной письменной команды GOTO не помогло бы обработать все файлы, переданные в качестве аргументов в пакетный файл, на который ссылается %*, поскольку из-за этой команды завершается цикл FOR и продолжите обработку пакетного файла в строке ниже строки с :PROCESS. Справка по команде CALL объясняет, как использовать эту команду для запуска подпрограммы. См. Также Куда возвращается GOTO: EOF?

Как правило, рекомендуется использовать цикл FOR , чтобы избежать назначения строк путем ссылки на переменную цикла без или с модификатором на переменные среды, если это не является необходимым, поскольку эти строки можно использовать непосредственно в командной строке для выполнения FOR . Это позволяет избежать отложенного расширения переменной среды или использования подпрограммы, которая может значительно ускорить выполнение сценария.

Я ничего не знаю о logparser. Это исполняемый файл с расширением .exe или .com или командный файл с расширением .bat или .cmd? Где хранится этот файл? Я предполагаю, что для приведенного ниже кода этот файл является исполняемым файлом, расположенным в каталоге командного файла, и поэтому для ссылки на него укажите полный путь, имя файла и расширение файла, используя "%~dp0logparser.exe". Но если logparser - это пакетный файл, хранящийся в том же каталоге, что и пакетный файл, который уже запущен, необходимо будет использовать call "%~dp0logparser.bat".

Я не знаю, действительно ли строка с одним аргументом, переданная в logparser, действительно верна. У меня есть некоторые сомнения относительно правильности передачи аргумента (ов) этому исполняемому файлу или сценарию, особенно если имена файлов или каталогов входного или выходного файла содержат символ пробела. Однако в приведенном ниже коде используется то, что написано как работающий в вопросе.

Приведенный ниже пакетный код учитывает все написанное выше.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "InputDirectory=%~dp0"
set "OutputDirectory=%InputDirectory%ParseOutput\"
md "%OutputDirectory%" 2>nul
for %%I in (%*) do "%~dp0logparser.exe" "SELECT DISTINCT date, time, X-Forwarded-For,cs-username, sc-status INTO %OutputDirectory%%%~nI_parsed.txt FROM %InputDirectory%%%~nxI -i:W3C -o:W3C
endlocal
pause

Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и внимательно прочитайте все страницы справки, отображаемые для каждой команды.

  • echo /?
  • endlocal /?
  • for /?
  • md /?
  • pause /?
  • set /?
  • setlocal /?

См. Также статью Microsoft о Использование операторов перенаправления команд .

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