批量检查最后一行是否包含单词

时间:2016-03-26 14:01:30

标签: windows batch-file cmd

我有2个批处理文件a.bat和b.bat。 a.bat调用b.bat,b.bat将一个句子打印到屏幕上。如何检查该句子以查看它是否包含单词以及是否包含将其设置为变量。例如

Sentance: Hello, how are you today?
If %Sentance contains% Hello set var=Hello
If %Sentance contains% Hi set var=hi

屏幕上可能有多个Sentance,所以我想查看最近显示的发送信号。

这就是我所拥有的。

for /f delims^=^ eol^= %%i in ('b.bat') do set lastline=%%i
set "var="
echo %lastline%|findstr /i "\<hi\>">nul && set "var=hi"
IF ERRORLEVEL 1 (GOTO NEXT0) ELSE (GOTO FOUND)
:NEXT0
echo %lastline%|findstr /i "\<hello\>">nul && set "var=hello"
IF ERRORLEVEL 0 (GOTO NEXT1) ELSE (GOTO FOUND)
:NEXT1
echo %lastline%|findstr /i "\<hola\>">nul && set "var=hola"
IF ERRORLEVEL 0 (GOTO NEXT2) ELSE (GOTO FOUND)
:found
echo %var%
pause

如果最后一行类似于&#34,则代码​​不起作用;这是一条消息你好&#34;

3 个答案:

答案 0 :(得分:2)

回显字符串并搜索关键字:

set sentence=Hello, how are you?
echo %sentence%|findstr /i "\<hello\>">nul && set "var=Hello"
echo %sentence%|findstr /i "\<hi\>">nul && set "var=Hi"

\<\>表示“字边界”,这可以避免误报(C hi nese,C hello ,...)

>nul将找到的字符串重定向到nirvana以保持屏幕清晰。

如果上一个命令(&&)成功,

set仅执行findstr命令。

修改

根据您的上一条评论,我了解到:a.bat来电b.batb.bat写了几行,而a.bat想要得到最后一行(我希望,我做对了)。

获取b.bat的最后一行,请使用:

for /f delims^=^ eol^= %%i in ('b.bat') do set lastline=%%i
echo you said: %lastline%
set "var="
echo %lastline%|findstr /i "\<hello\>">nul && set "var=Hello"
echo %lastline%|findstr /i "\<hi\>">nul && set "var=Hi"
echo %lastline%|findstr /i "\<hola\>">nul && set "var=Hola"
echo/%var%

但是有一点问题:for捕获b.bat的输出,而不是将其显示在屏幕上。 (特别是set /p的提示 - 所以你不知道,何时或输入什么)。要解决此问题,请强制b.bat写入屏幕(>con直接写入屏幕)。所以基本上,b.bat应该是这样的:

@echo off
echo this line gets captured by a.bat
>con echo this line goes directly to screen
>con set /p "input=give me input: "
echo something about %input%.

注意:我使用了来自aschipfl的答案的eol - 技巧,因为(虽然它看起来很丑陋)这对于";都有效,这对“标准”来说是有问题的方式“("delims= eol=")。当然,这仍然不是万无一失的(例如&仍然存在问题)

答案 1 :(得分:1)

Stephan's answer已经展示了如何在被调用批处理文件b.bat的输出中查找特定单词。

要检查来电者b.bata.bat的输出,您可以执行以下操作:

假设b.bat包含以下内容:

echo Hello, how are you?

a.bat可能如下所示:

for /F delims^=^ eol^= %%L in ('
    b.bat ^| findstr /I /R /C:"\<hello\>" /C:"\<hi\>"
') do (
    set "FOUND=%%L"
)

这会将b.bat的输出传递到findstr,它使用多个搜索字符串,然后由for /F循环捕获其输出,该循环将输出分配给变量{{1 }}

答案 2 :(得分:1)

Echo off
:Loop
    Set /p Input=%CD%^>
    rem Show what the user typed
    Echo %Input%
    rem Execute user's typed command
    %Input%
    rem Get first word and rest of line
    for /f "tokens=1*" %%A in ("%input%") do echo %%A AND %%B
Goto Loop

获取用户输入的内容并模仿cmd处理(按Ctrl + C停止)。使用set来操作文本。

您可以使用for循环来分解文本。