拖放多个文件以使用日志解析器

时间:2019-06-19 21:54:41

标签: batch-file

我的问题很简单,我想批量运行日志解析器,但是我没有处理多个文件或文件夹的经验。

我一直在整理这段代码,到目前为止得到了:

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

我想要的结果是,如果我拖放几个文件,它们将输出已解析的文件,每个输入文件一个。但是,如果我只放置一个fil,一切都很好,但是如果我放多个文件,它只会做第一个。我知道我的错误是在:process上,但是如何从:process返回到循环并继续我离开的地方?

1 个答案:

答案 0 :(得分:0)

%~dp0引用的批处理文件的文件夹路径始终以\结尾。因此,在批处理文件中使用%~dp0的情况下,%~dp0独立后不应有反斜杠。

如果确实不需要,则不建议启用延迟的环境变量扩展,因为这样做会导致重复解析批处理文件中的每个命令行,并且!到处都被解释为延迟的扩展环境变量的开始/结束参考,在文件和目录名称中包括感叹号。

Why is no string output with 'echo %var%' after using 'set var = text' on command line?的答案说明了在将字符串值分配给环境变量时使用语法set "variable=value"的原因。文件和文件夹名称可以在批处理文件(如空格)中包含特殊含义的字符,也可以包含这些字符之一&()[]{}^=;!'+,`~,而这些字符之一需要用"括起文件/文件夹字符串才能由Windows命令处理器逐字解释。在命令提示符窗口cmd /?中运行,并阅读输出帮助,尤其是最后一个输出帮助页面上的最后一部分。

GO TO是无效命令。在debugging the batch file上可以看到此错误,方法是在命令提示符窗口中执行该命令,以查看cmd.exe处理批处理脚本所输出的错误消息。可以在命令提示符窗口help中运行,以显示Windows Commands的列表以及每个命令的简要说明。 cmd.exe的所有内部命令和大多数外部命令(%SystemRoot%\System32中的* .com或* .exe)都可以在命令提示符窗口中以/?作为参数来显示,以显示帮助。此命令。有关Windows命令的更多详细信息,请访问SS64.com - A-Z index of the Windows CMD command line

使用正确的书面命令 GOTO 不会帮助处理所有作为参数传递给%*引用的批处理文件的文件,因为该命令会导致留下 FOR < / strong>循环并在:PROCESS行下面的行继续进行批处理文件处理。命令 CALL 的帮助说明了如何使用此命令运行子例程。另请参见Where does GOTO :EOF return to?

通常建议使用 FOR 循环来避免分配字符串,方法是在不需要或不带修饰符的情况下,通过引用循环变量为环境变量分配get,因为这是可能的,因为可以使用它们直接在命令行中输入字符串以由 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关于Using command redirection operators的文章。