【问题标题】:Regex in powershell does not work as expectedpowershell 中的正则表达式无法按预期工作
【发布时间】:2015-05-16 11:53:28
【问题描述】:

我将碎片整理分析的输出存储在一个变量中,然后我尝试匹配一个模式来检索一个数字。

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

我做错了什么?

【问题讨论】:

  • 怀疑您可能正在处理换行问题...可能会检查诸如将结果管道传输到文件,然后在文件上使用 Get-Content,然后使用 Out-String 来清除中断。不确定我头顶的语法,对不起:)
  • 我只是按照你说的做了,还是不行。我还尝试强制转换为字符串而不是使用Out-String 来删除每个换行符,它也不起作用。
  • 好的,PowerShell 正则表达式还有一个显式的多行修饰符..类似于 [regex]::matches($str, "fragmente[^.0-9]*([0-9] +)%", "MultiLine")..再次抱歉语法粗糙,暂时无法测试
  • 我必须为我将字符串转换为英文,但它工作得很好。我不确定,但想知道口音是否是问题所在。
  • 您确定$result 包含运行时您期望的文本吗?你是从提升的控制台运行它吗?

标签: regex powershell


【解决方案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 $resultSystem.String 没有它你会得到System.Object

错误理论

如果我没有以管理员身份运行 PowerShell,那么我可以获得匹配为 False 的唯一方法。这很重要,因为如果没有,您会收到一条消息

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

【讨论】:

  • 嗯,似乎口音是问题所在。我试着用另一个没有重音的词,它起作用了。那么我应该如何设置我的 powershell 来支持口音呢?
  • @LoveMetal 您使用的是控制台还是 ISE,您运行的是哪个版本的 PS?
  • 管理员模式下的 Powershell 控制台,版本 4
  • 以管理员身份使用 powershell,版本 4
猜你喜欢
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
相关资源
最近更新 更多