PowerShell在包含短语的行中查找单词

yxyvkwin  于 2023-04-06  发布在  Shell
关注(0)|答案(2)|浏览(96)

我正在编写一个脚本,它遍历一个文本文件,找到我需要的变量的名称,并将其存储为变量。假设在thext的某个地方,我有以下行:
Friend Const STR_NAME As String = "Test Name"
现在我想从包含"Test Name"Friend Const的行中提取单词STR_NAME。我知道我需要的单词STR_NAME是该行中的第三个单词。所以我想要的基本内容如下所示:
$name = function("Test Name",Friend Const)
这给出了行中的第三个字符串,在本例中为:
$name = "STR_NAME"
我怎样才能做到这一点?
谢谢

wb1gzix0

wb1gzix01#

你可以使用Select-String -SimpleMatch来找到包含Test Name的行,然后对于捕获的.Line,你可以用空格分割并选择数组的第二个索引(第三个字):

Select-String path\to\textfile.txt -Pattern 'Test Name' -SimpleMatch |
    ForEach-Object { $_.Line.Split(' ')[2] }
waxmsbnn

waxmsbnn2#

除了解析变量名之外,还可以获取变量对象类型及其值。
就像

$var = switch -Regex -File 'D:\Test\test.txt' {
    'Friend Const\s+(\w+)\s+(?:as\s+)?(\w+)?\s*=\s*(.+)' { 
        [PsCustomObject]@{ Name = $Matches[1]; Type = $Matches[2]; Value = $Matches[3] }
    }
}

$var

输出:

Name     Type   Value      
----     ----   -----      
STR_NAME String "Test Name"

所以你有

$var.Name   # --> STR_NAME
$var.Type   # --> String
$var.Value  # --> "Test Name"

在您的文件中可能有更多类似的行,因此$var可能是具有以下属性的对象数组
如果你想为此创建一个函数,这里的想法是:

function Find-Variable {
    param(
        [string]$Path,
        [string]$Declaration,
        [string]$Value
    )
    switch -Regex -File $Path {
        "$Declaration\s+(\w+)\s+(?:as\s+)?(\w+)?\s*=\s*($Value)" { 
            [PsCustomObject]@{ Name = $Matches[1]; Type = $Matches[2]; Value = $Matches[3] }
        }
    }
}

使用方法:

$var = Find-Variable -Path 'D:\Test\test.txt' -Declaration 'Friend Const' -Value '"Test Name"'

相关问题