将变量设置为文本文件中的第一个单词

问题描述 投票:-1回答:2

我正在尝试读取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

batch-file cmd
2个回答
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打破了块或循环上下文。 这是大文本文件的推荐变体。


0
投票

我发现在PowerShell中使用正则表达式更直接。必须转义方括号,因为它们在正则表达式中用于指定字符集。

Get-Content -Path './firstword.txt' |
    ForEach-Object {
        if ($_ -match '\[(\d+)\]') {
            $thenumber = $matches[1]

            $thenumber
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.