我正在尝试读取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
的建议吗?
答案 0 :(得分:0)
您的方法无法按预期工作,因为您需要启用并应用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
打破了块或循环上下文
这是大文本文件的推荐变体。
答案 1 :(得分:0)
我发现在PowerShell中使用正则表达式更直接。必须转义方括号,因为它们在正则表达式中用于指定字符集。
Get-Content -Path './firstword.txt' |
ForEach-Object {
if ($_ -match '\[(\d+)\]') {
$thenumber = $matches[1]
$thenumber
}
}