>我有一个函数,它应该在文本文件中检索修订号。文本文件如下所示:
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
不会添加到输出中。