例如:Set var=findstr "name" temp.txt [temp.txt consist multiple lines , out of which one line says "my name is ABC"]
稍后找到该行的最后一个单词,即 ABC
2 回答
要捕获命令的输出,请使用for /f
循环。有关help for
更多信息,请参阅。
练习 1
要将 的值设置%var%
为 的输出findstr
,请执行以下操作:
for /f "delims=" %%I in ('findstr /i "name" "temp.txt"') do set "var=%%I"
然后,如果您想要该行的最后一个单词,则可以使用基本for
循环来遍历%var%
.
for %%I in (%var%) do set "lastword=%%I"
set "var=%lastword%"
练习 2
或者,如果您知道包含“name”的行将始终是 4 个标记(如“My name is blah”),您可以简单地捕获输出的第四个标记,findstr
如下所示。
for /f "tokens=4" %%I in ('findstr /i "name" "temp.txt"') do set "var=%%I"
就是这样。 %var%
将包含匹配的行的第四个单词findstr
。
练习 3
如果您知道该行将始终以“我的名字是”开头,但您想要名字和姓氏的可能性,或者像“John Jacob Jingleheimer-Schmidt”这样的很多名字,您可以使用tokens
来捕获您想要的类似于练习 2。
for /f "tokens=3*" %%I in ('findstr /i "name" "temp.txt"') do set "var=%%J"
请注意,我捕获%%J
而不是%%I
这次。那是因为%%I
将是标记 3(第三个单词),而%%J
之后的所有内容(通配符tokens=3*
)。
练习 4
或者,如果名称可能是名字和姓氏,但您知道它将以“我的名字是”开头,您可以通过变量子字符串替换删除“我的名字是”部分。
for /f "delims=" %%I in ('findstr /i "name" "temp.txt"') do set "var=%%I"
set "var=%var:My name is =%"
这将从 的值中删除“My Name is” %var%
,留下“John Smith”。
练习 5
如果您不能指望包含“name”的行是相同数量的单词(例如,“Hi there!My name is”或“Hello!My name is”,您可以使用带通配符的变量子字符串替换去除可变内容。无论名称是一个词还是多个单词,并且无论“名称是”之前的内容是否变化,这都应该起作用。
for /f "delims=" %%I in ('findstr /i "name" "temp.txt"') do set "var=%%I"
set "var=%var:*name is =%"
与其他编程语言一样,您也可以将变量存储在内存中以供进一步使用:
@echo off&setlocal
set "file=temp.txt"
set "search=name"
:: clear the local environment
for /f "delims==" %%i in ('set $ 2^>nul') do set "%%i="
:: find the lines containing %search%
for /f "delims=" %%i in ('findstr "%search%" "%file%"') do set "$%%i=%%i"
:: show the line variables
set $