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

时间:2018-03-01 15:39:06

标签: batch-file cmd

我正在尝试读取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的建议吗?

2 个答案:

答案 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
        }
    }