使用正则表达式提取字符串检索"真111499"



>我有一个函数,它应该在文本文件中检索修订号。文本文件如下所示:

componentname1:123456
componentname2:234567

第二部分是一个数字,代表子版本号。powershell 脚本逐行读取此文件,然后使用此函数处理每一行:

function getRevision($line) {
$line -match ":(?<revision>[0-9]*)"
$result = $Matches['revision']
Write-Host "Found component revision '$($result)'"
return $result
}

当函数getRevision被处理时,它会给出输出

Found component revision '111499'

此函数由另一个函数调用,如下所示:

$rev = getRevision($Line)
# ....
someOtherFunction -Revision "$($rev)"

在这个someOtherFunction中,我现在得到这样的输出:

Handle component with revision 'True 111499'

编辑我添加函数的基本代码someOtherFunction

function someOtherFunction {
param(
[Parameter(Mandatory=$True)]
[String]$Revision
)
Write-Host "Handle component with revision '$($Revision)'"
}

现在,问题来了:为什么会有这种True的东西?我的错误在哪里?

如果这就是源数据的形成方式,即冒号分隔的键值对。我认为ConvertFrom-StringData消除了这个问题的所有"复杂性"。然而,它想要"key=value",所以我们需要做一个小的改变,最后,你会得到整个文件作为一个哈希表。

如果该示例数据位于名为 c:\temp\file 的文件中.txt

$revisions = (Get-Content -Raw C:tempfile.txt) -replace ":","=" | ConvertFrom-StringData
$revisions['componentname1']

如果存在错误数据的风险,您可以通过仅使用带有冒号的行来执行一些基本的筛选:

$data = (Get-Content  C:tempfile.txt | Where-Object{$_ -match ":"}) -replace ":","=" | Out-String | ConvertFrom-StringData
$data['componentname1']

关键字True来自函数第一行-match运算符

$line -match ":(?<revision>[0-9]*)"

如果在函数内部执行-match,则其输出(二进制值(将自动添加到函数的输出中,然后$result作为第二个元素添加。因此,如果您检查$rev的值,您将看到:

PowerShell> $rev
True
123456

如果你想摆脱第一个元素,你只需要用管道把它传送到Out-Null

$line -match ":(?<revision>[0-9]*)" | Out-Null

编辑:正如Matt所指出的,如果$line与模式不匹配,它可能会返回意外的结果(上次成功匹配(。为了防止这种情况,您可以使用:

if ($line -match ":(?<revision>[0-9]*)") {
$result = $Matches['revision'] 
Write-Host "Found component revision '$($result)'"
return $result}
else {return $false}

在这种情况下,不需要Out-Null,因为if条件内部-match不会添加到输出中。

最新更新