我将碎片整理分析的输出存储在变量中,然后我尝试匹配模式以检索数字。
在this following online regex tester中,它运行正常,但在powershell中,String -match $pattern
返回false。
我的代码:
$result = Defrag C: /A /V | Out-String
echo $result
$pattern = "fragmenté[^.0-9]*([0-9]+)%"
$result -match $pattern
我做错了什么?
答案 0 :(得分:1)
我的代码实际上没有问题。我只需要改变比赛以支持我的英语输出。 Wolfgang Kluge可能是关于空白的事情。但是,如果您的输出实际与正则表达式测试器中的输出相匹配,那么我不确定您遇到的问题。
为了好玩,我建议您对代码进行此更新。这使用ConvertFrom-StringData
。我在this answer中更多地解释了代码。
$defrag = Defrag C: /A /V | out-string
$hash = (($defrag -split "`r`n" | Where-Object{$_ -match "="}) -join "`r`n" | ConvertFrom-StringData)
$result = New-Object -TypeName PSCustomObject -Property $hash
$result."Quantité totale d'espace fragmenté"
这当然是假设您的PowerShell完全可以使用单词中的重音。在我的ISE 3.0上面的代码工作。
再次......在您的问题中,您的代码对我来说很合适。我也不认为Out-String
是必需。我仍然得到积极的输出。使用Out-String
,我得到额外的输出,包括整个匹配的行。否则我只是得到一个布尔值。在两者中(使用以下代码)我仍然得到一个结果。
$result = Defrag C: /A /V #| Out-String
$pattern = "fragmented space[^.0-9]*([0-9]+)%"
$result -match $pattern
$Matches[1]
-match
用作数组运算符,用于更改$result
的处理方式。 Out-String
$result
为System.String
而没有System.Object
虚假理论
我可以将匹配设置为False
的唯一方法是,如果我没有以管理员身份运行PowerShell。这很重要,因为如果没有,你会得到一条消息
磁盘碎片整理程序无法启动,因为您没有足够的priveleges来执行此操作。 (0x89000024)