我编写了一个脚本来调用外部命令并使用正则表达式捕获其部分输出。这是一个示例(不是真实世界)脚本来演示我是如何做到的:
$output = clip
if ($output -imatch 'usage')
{
Write-Output $matches[0]
}
如果我在命令提示符下运行clip
,其输出如下所示:
信息:输入“CLIP /?”用法。
在上面的代码中,匹配成功,但未设置$matches
。如果我使用不同的方法(如下所示)设置$output
,则问题就会消失:
$output = 'INFO: Type "CLIP /?" for usage.'
为什么在调用命令时未设置$matches
?我该如何解决这个问题?
答案 0 :(得分:4)
当你运行没有参数的clip.exe
时,结果是:
PS > clip
Infos : Entrez "CLIP /?" pour afficher la syntaxe.
产生了两行:
因此,当您编写$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的新手,所以欢迎解释。