2015-05-16 73 views
0

我将碎片整理分析的输出存储在一个变量中,然后尝试匹配一个模式来检索一个数字。PowerShell中的正则表达式不能正常工作

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

怀疑你可能正在处理换行问题......可能会检查诸如将结果输送到文件,然后使用文件上的Get-Content,然后使用Out-String来清除中断。不知道在我的头顶上的语法,对不起:) –

+0

我只是做你刚刚说的,它仍然无法正常工作。我也尝试将其转换为字符串,而不是使用“Out-String”来删除每一行换行符,而且它也不起作用。 – Lovy

+0

好吧,还有一个显式的多行修饰符,用于PowerShell regexps..something like [regex] :: matches($ str,“fragmente [^。0-9] *([0-9] +)%”,“MultiLine “)..再次抱歉粗略的语法,只是暂时不能测试 –

回答

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中以管理员身份。这很重要,因为如果没有,您将收到一条消息

磁盘碎片整理程序无法启动,因为您没有足够的许可证来执行此操作。 (0x89000024)

+0

好吧,似乎口音是问题。我尝试用另一个单词w/o口音,它的工作。我应该如何设置我的PowerShell来支持重音呢? – Lovy

+0

@LoveMetal您正在使用控制台或ISE以及您正在运行的是哪个版本的PS? – Matt

+0

管理模式下的Powershell控制台,版本4 – Lovy