我是PowerShell的新手,我正在尝试编写一个脚本来复制以vhd
或vhdx
我可以枚举像这样的文件目录:
$NEWEST_VHD = Get-ChildItem -Path $vhdSourceDir | Where-Object Name -match ".vhdx?"
这将匹配
foo.vhd
foo.vhdx
然而,这也将匹配
foo.vhdxxxx
如何编写匹配仅匹配以vhd
或vhdx
结尾的文件?
尝试失败
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/
答案 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"那你就安全了同样,这不是一个答案,只是有用的知识。提醒一下,?
在这种情况下可选地匹配单个字符,但它不是正则表达式只是一个基本的文件系统通配符。
根据您在此处拥有的文件数量,您可以争辩说这会更有效率,因为您将获得所需的所有文件,而不是事后过滤。