Powershell正则表达式匹配字符串末尾的vhd或vhdx

时间:2015-04-08 17:56:49

标签: regex powershell

我是PowerShell的新手,我正在尝试编写一个脚本来复制以vhdvhdx

结尾的文件

我可以枚举像这样的文件目录:

$NEWEST_VHD = Get-ChildItem -Path $vhdSourceDir | Where-Object Name -match ".vhdx?" 

这将匹配

 foo.vhd
 foo.vhdx

然而,这也将匹配

foo.vhdxxxx

如何编写匹配匹配以vhdvhdx结尾的文件?

尝试失败

Where-Object Name -match ".vhdx?" 
Where-Object Name -like ".vhdx?"
Where-Object Name -match ".[vhd]x?" 
Where-Object Name -match ".[vhd]\^x?"  

我调查的资源

http://ss64.com/ps/syntax-regex.html
https://technet.microsoft.com/en-us/library/ff730947.aspx
http://www.regexr.com/

3 个答案:

答案 0 :(得分:3)

在模式的末尾添加$

-match ".vhdx?$"
正则表达式模式中的

$表示字符串的结尾。因此,如果它在最后,则上述内容仅匹配.vhdx?。请参阅下面的演示:

PS > 'foo.vhd' -match ".vhdx?$"
True
PS > 'foo.vhdx' -match ".vhdx?$"
True
PS > 'foo.vhdxxxx' -match ".vhdx?$"
False
PS >

此外,.字符在正则表达式模式中具有特殊含义:它告诉PowerShell匹配除了换行符之外的任何字符。因此,您可以体验以下行为:

PS > 'foo.xvhd' -match ".vhdx?$"
True
PS >

如果不合需要,可以在\

之前添加.
PS > 'foo.xvhd' -match "\.vhdx?$"
False
PS > 

这告诉PowerShell匹配一个文字句点。

答案 1 :(得分:2)

如果您只想查看扩展名,那么您可以使用Extension属性而不是Name

$NEWEST_VHD = Get-ChildItem -Path $vhdSourceDir | Where-Object Extension -in '.vhd','.vhdx'

答案 2 :(得分:1)

主要只是一个FYI,但是对于这个特定问题,不需要正则表达式解决方案。你可以使用一个简单的过滤器。

$NEWEST_VHD = Get-ChildItem -Path $vhdSourceDir -Filter ".vhd?"

不完美,但如果你没有名为" .vhdz"那你就安全了同样,这不是一个答案,只是有用的知识。提醒一下,?在这种情况下可选地匹配单个字符,但它不是正则表达式只是一个基本的文件系统通配符。

根据您在此处拥有的文件数量,您可以争辩说这会更有效率,因为您将获得所需的所有文件,而不是事后过滤。