如何在变量中设置命令输出,然后在批处理脚本中用于进一步搜索

时间:2013-04-08 11:55:18

标签: batch-file

例如:Set var=findstr "name" temp.txt [temp.txt consist multiple lines , out of which one line says "my name is ABC"]稍后找到该行的最后一个单词,即ABC

2 个答案:

答案 0 :(得分:0)

要捕获命令的输出,请使用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个令牌长(如“我的名字是等等”),您可以简单地捕获findstr输出的第四个令牌此

for /f "tokens=4" %%I in ('findstr /i "name" "temp.txt"') do set "var=%%I"

就是这样。 %var%将包含findstr匹配的第四个单词。


练习3

如果您知道该行将始终以“我的名字是”开头,但您想要姓名的可能性,或许多名称如“John Jacob Jingleheimer-Schmidt”,您可以使用{{1}捕捉你想要的东西,类似于练习2。

tokens

请注意,这次我抓取了for /f "tokens=3*" %%I in ('findstr /i "name" "temp.txt"') do set "var=%%J" 而不是%%J。这是因为%%I将是令牌3(第三个单词),而%%I就是其后的所有内容(%%J中的通配符)。


练习4

或者,如果名称可能是名字和姓氏,但您知道它的前面是“我的名字是”,您可以通过variable substring substitution删除“我的名字”部分。< / p>

tokens=3*

将从for /f "delims=" %%I in ('findstr /i "name" "temp.txt"') do set "var=%%I" set "var=%var:My name is =%" 的值中删除“我的名字是”,留下“约翰史密斯”。


练习5

如果你不能指望包含“name”的行是相同数量的单词(例如,“你好!我的名字是”或“你好!我的名字是”,你可以使用{{3使用通配符去除变量内容。无论名称是一个字还是更多,这都应该有效,无论“名称”之前的内容是否有所不同。

%var%

答案 1 :(得分:0)

与批处理中的其他编程语言一样,您可以将变量存储在内存中以供进一步使用:

@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 $