Путь к папке пакетного файла, на который ссылается %~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 о Использование операторов перенаправления команд .