-match成功但不更新$ match

时间:2013-09-02 02:31:02

标签: regex powershell

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

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

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

  

信息:输入“CLIP /?”用法。

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

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

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

2 个答案:

答案 0 :(得分:4)

当你运行没有参数的clip.exe时,结果是:

PS > clip

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

产生了两行:

  1. 回车/换行(空)
  2. 带文字的第二行
  3. 因此,当您编写$output = clip时,您正在为$output分配一个数组。 $output[0]是空行,$output[1]是文本行。 Out-String cmdlet会删除不必要的CR / LF。

    您可以尝试这样的事情:

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

    被修改

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

      

    当输入为标量时,[-match运算符]会填充$Matches自动变量。

答案 1 :(得分:0)

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

来解决此问题
$output = clip | Out-String

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