基于正则表达式获取路径 Powershell

Get path based on regex Powershell

我查询了注册表以获取我要查找的文件路径。但是,我需要下一个目录来检索我需要的一些文件信息。我尝试匹配的模式是 OfficexxOFFICExx。我似乎无法获得我需要的路径。

从注册表中找到路径:C:\Program Files\Microsoft Office

我需要的是:C:\Program Files\Microsoft Office\Officexx

代码:

$base_install_path = "C:\Program Files\Microsoft Office";
$full_install_path = $base_install_path+'\Office[\d+.*]'
Write-Output $full_install_path;  

这个returns:

C:\Program Files\Microsoft Office\Office[\d+.*] 

期望的输出:

C:\Program Files\Microsoft Office\Office15

这不能是任何两位数# ^^

Get-ChildItem -Path 'C:\Program Files\Microsoft Office\' -Directory | 
    Where-Object { $_.Name -match 'Office\d+' }

在您的正则表达式中,[] 是一个字符 class,这意味着 [\d+.*] 不是“一个或多个数字”,而是“反斜杠 OR d OR 加号 OR 点号 OR 星号” .

PS C:\> "d+\" -match "[\d+]"
True

不是您想要的。

基于 Santiago Squarzon's 有用的评论:

# Find all child directories matching the given wildcard pattern, if any.
Get-ChildItem -Directory -Path "$base_install_path\Office[0-9][0-9]*"
  • 与 POSIX 兼容的 shell 不同,例如 bash,PowerShell 支持不带引号的字符串的自动匹配(模式匹配文件名,称为 filename expansion) and instead requires explicit use of the Get-ChildItem or Get-Item cmdlet;例如,PowerShell 中 bash 命令 pattern='*.txt'; echo $pattern 的等价物是 $pattern='*.txt'; Get-ChildItem -Path $pattern

    • 请注意,描述匹配文件或目录的 对象 由这些 cmdlet 输出;根据需要使用它们的属性,例如(Get-ChildItem $pattern).Name(Get-ChildItem $pattern).FullName(完整路径)。使用 Get-ChildItem $pattern | Get-Member -Type Properties 查看所有可用属性。
  • 这些 cmdlet 的 -Path 参数需要 PowerShell wildcard expression 来执行所需的匹配,并且顶部命令中的表达式与 完全匹配两个 数字 ([0-9][0-9]),后跟 零个或多个 个字符 (*),无论它们是什么(可能包括额外的数字)。

    • 注意:仅 PowerShell 的通配符语言 - 被 -Path-Include / -Exclude 接受参数(以及在许多其他上下文中)- 支持字符 ranges(例如 [0-9] 以匹配任何十进制数字)和 sets(例如 [._] 以匹配 ._)。相比之下,Get-ChildItem-Filter 参数使用 文件系统 API 的通配符语言(与 cmd.exe 一样),它 支持它们,并且还表现出遗留问题 - 请参阅 了解更多信息。

    • 虽然 PowerShell 的通配符范围和集合从根本上与正则表达式(正则表达式,见下文)工作相同,但正则表达式特定的转义序列(例如 \d支持,你通常不能量化它们;也就是说,像 [0-9] 这样的东西只会匹配 恰好一个 数字。


假设通配符模式只支持one,非特定duplication construct,即前面提到的*,匹配一个特定范围 的数字 - 例如 1 或 2 最多特定计数 - 例如正好两个 - 需要post-基于regex的过滤(这是你尝试使用的):

# Find all child directories matching the given regex, if any.
# Matches 'Office' at the start of the name (^),
# followed by 1 or 2 ({1,2}) digits (\d), 
# followed by at least non-digit (\D), if any (?)
Get-ChildItem -Directory -LiteralPath $base_install_path |
  Where-Object Name -match '^Office\d{1,2}\D?'

至于你试过的:

  • [\d+.*] 是一个 正则表达式 ,但您的意思可能是 \d+.*,即一个或多个 (+)数字 (\d) 后跟零个 (*) 个字符,无论它们是什么 (.)

  • 在character-range/set表达式([...])中,使用了+.* verbatim,即它们是 not 元字符并匹配 literal .* 字符。