-匹配成功但不更新$matches

Sam*_*Sam 2 regex powershell

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

$output = clip
if ($output -imatch 'usage')
{
    Write-Output $matches[0]
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

$output = 'INFO: Type "CLIP /?" for usage.'
Run Code Online (Sandbox Code Playgroud)

为什么$matches我调用命令时没有设置?我怎样才能解决这个问题?

JPB*_*anc 6

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

\n\n
PS > clip\n\nInfos\xc2\xa0: Entrez "CLIP /?" pour afficher la syntaxe.\n
Run Code Online (Sandbox Code Playgroud)\n\n

生产了两条线:

\n\n
    \n
  1. 回车/换行(空)
  2. \n
  3. 第二行文字
  4. \n
\n\n

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

\n\n

你可以尝试这样的事情:

\n\n
clip | where {$_ -imatch \'syntaxe\'} | % {$matches}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

已编辑

\n\n

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

\n\n
\n

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

\n
\n