我的问题很简单,我想批量运行日志解析器,但是我没有处理多个文件或文件夹的经验。
我一直在整理这段代码,到目前为止得到了:
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返回到循环并继续我离开的地方?
答案 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的文章。