2017-09-05 50 views
0

我需要批处理文件的帮助。从.txt文件中拉出文本批处理

我有一个.log文件,其中我搜索一个特定的字符串,但现在我有麻烦在我的下一步,我需要搜索其他字符串,然后获取“”之间的字符串批量使用它我不是当然,如果这是可行的。

例子:

set findtext="text2find" 
set findfile="text.log" 

findstr %findtext% %findfile% 

if %errorlevel% == 0 (
findstr "Creating Environment " %findfile% 
if %errorlevel% == 0 (
set Environment=[Text from log file] 
) 
) 

日志文件包含一行: 创建环境 “EnvironmentName”

EnvironmentName是,我需要在批处理文件中使用的字符串。

这可能吗?

提前感谢您的时间。

+0

是的。你可以使用'FOR/F'命令来解析'FIND'或'FINDSTR'命令的输出。 – Squashman

+0

在一个块(括号中的行序列)中,'%anyvariable%'被评估为变量的初始值,因此在第二个'findstr'之后'%errorlevel%'将被替换为'0'。这里的正常解决方案是使用'if not errorlevel 1',这意味着'如果当前错误级别不是1也不大于1',因此在正常情况下为'0'。注意:不涉及'%'。 – Magoo

回答

1
set "environmentname=" 
for /f "tokens=1,2*delims= " %%a in (%findfile%) do (
if /i "%%~a%%~b"=="creatingenvironment" set "environmentname=%%~c" 
) 
if defined environmentname (
echo environment name=%environmentname% 
) else (
echo environment name was not found 
) 

这应该得到您的数据。我假定你已经适当地设置了findfile

for /f“tokenises”它从文件中读取的每一行。线被解释为

定界符 TOKEN1 定界符 token2 定界符 token3 ...

其中该组以下的delims选项=(在这种情况下,空间)的字符被定义为分隔符。

tokens=...定义将选择哪些标记。在这种情况下,将选择令牌1和令牌2以及*,这意味着“指定的最高令牌编号之后的所有内容”,因此令牌3 和其余行将成为第三个选择。

第一选择将被分配给定义的metavariable,在这种情况下为%%a。下一个将被分配到%%b等等。这些metavariables区分大小写。

因此,对于有问题的线路,%%a得到creating%%b得到environment%%c得到"EnvironmentName"

if /i比较不区分大小写的(这就是为什么我没有理会你已经使用的情况下)。 ~删除围绕变量内容的任何引号,因此目标行的%%~a%%~b将为creatingenvironment。检测到该行时,分配行的其余部分 - 将引号(%%~c)包含在变量中。

当该文件已被处理,看是否变量被设置并报告任何内容或尚未设置(这就是为什么它被明确设置为什么被处理的文件之前。

请注意,我刚刚输入这个动态,我没有测试它。可能有错误 - 这就是为什么用于变量名称的战争与和平是缺点。变量名称不区分大小写。

如果文件名包含空格,那么你需要

for /f "usebackqtokens=1,2*delims= " %%a in ("%findfile%") do (

(这也会为文件名的工作,没有空间,当然 - 但引入并不需要在马上解释一个额外的元素检测所需数据的上下文)