我正在尝试读取FIND /n "some text" a_file
的输出以将第一个行号存储在变量中...
假设文件内容是:
[342]>>> (1-WARNING) Variable ANAME assigned but never read [343]>>> (2-ERROR) Too few ENDWHILEs, 1 WHILE command(s) not terminated
我使用以下方式读取文件:
for /f "delims=[]" %%a in (found.txt) do (if "%%a" neq "" set l=%%a & echo a = %%a & echo l = %l%)
从echo
命令,我看到变量%%a
具有正确的值,但它没有分配给l
有什么建议让价值进入l
?
您的方法无法按预期工作,因为您需要启用并应用delayed variable expansion,因为您在同一代码块中编写和读取变量。
无论如何,我会这样做(当你让find
立即解析found.exe
的输出时,实际上没有必要将for /F
的结果存储到find
):
set "WORD="
for /F "delims=[]" %%A in ('^< "a_file" find /N "some text"') do (
if not defined WORD set "WORD=%%A"
)
变量WORD
(我不喜欢像l
这样的变量名只由一个字母组成)在第一次循环迭代中被分配,因为if defined
查询(为此,变量需要最初清除)。
或者像这样:
for /F "delims=[]" %%A in ('^< "a_file" find /N "some text"') do (
set "WORD=%%A"
goto :NEXT
)
:NEXT
循环在第一次迭代后离开,因为goto
打破了块或循环上下文。
这是大文本文件的推荐变体。
我发现在PowerShell中使用正则表达式更直接。必须转义方括号,因为它们在正则表达式中用于指定字符集。
Get-Content -Path './firstword.txt' |
ForEach-Object {
if ($_ -match '\[(\d+)\]') {
$thenumber = $matches[1]
$thenumber
}
}