【问题标题】:-match succeeds but doesn't update $matches-match 成功但不更新 $matches
【发布时间】:2013-09-06 17:04:23
【问题描述】:

我编写了一个脚本来调用外部命令并使用正则表达式捕获其输出的一部分。这是一个示例(不是真实世界)脚本来演示我是如何做到这一点的:

$output = clip
if ($output -imatch 'usage')
{
    Write-Output $matches[0]
}

如果我在命令提示符下运行clip,它的输出如下所示:

信息:键入“CLIP /?”供使用。

在上面的代码中,匹配成功,但没有设置$matches。如果我使用以下不同的方法设置$output,问题就会消失:

$output = 'INFO: Type "CLIP /?" for usage.'

为什么我调用命令时没有设置$matches?我该如何解决这个问题?

【问题讨论】:

    标签: regex powershell


    【解决方案1】:

    当你不带参数运行clip.exe时,结果是:

    PS > clip
    
    Infos : Entrez "CLIP /?" pour afficher la syntaxe.
    

    产生了两行:

    1. 回车/换行(空)
    2. 第二行文字

    因此,当您编写$output = clip 时,您将一个数组分配给$output$output[0] 是空行,$output[1] 是文本行。 Out-String cmdlet 删除了不必要的 CR/LF。

    你可以试试这样的:

    clip | where {$_ -imatch 'syntaxe'} | % {$matches}
    

    编辑

    据我了解,$matches 未填充的原因是-imatch 的输入是一个数组。正如您在about_comparison_Operators 中看到的那样:

    "当输入为标量时,它[-match operator] 填充$Matches 自动变量。

    【讨论】:

    • 谢谢!不过,您的回答仍然无法解释为什么没有设置 $matches
    • 当然解释了!看看man about_comparison_Operators“当输入是标量时,它会填充$Matches自动变量。
    • 谢谢。如果您更新答案来解释这一点,我可能会接受。
    • 谢谢!我将编辑您的答案以使其更清楚,然后我想我会接受它。
    【解决方案2】:

    我检查了$output 的类型,发现它似乎是一个数组而不是一个字符串。我通过将上面示例中的第一行更改为:

    $output = clip | Out-String
    

    我是 PowerShell 新手,所以欢迎解释。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2017-06-11
    • 2015-03-03
    相关资源
    最近更新 更多