使用下面的代码可以排除目录名中包含任何字符A-Z的任何目录,只需将具有数值的目录添加到数组中即可。这很好用,直到开发人员开始使用最新版本将新文件夹添加到C:\ Program Files \ Tableau \ Tableau Server \目录中。 文件夹名称的示例是10.0,10.1,10.2,10.4,Install,Bin
$Array = Get-ChildItem "C:\Program Files\Tableau\Tableau Server" |
? { $_.PSIsContainer } |
Sort-Object LastWriteTime -Descending |
foreach { $_.Name }
$TABCMD = "C:\Program Files\Tableau\Tableau Server\" + $Array[0] + "\bin\tabcmd.exe"
答案 0 :(得分:2)
简化的 PSv3 + 解决方案:
$array = (Get-ChildItem -Directory "C:\Program Files\Tableau\Tableau Server\[0-9]*" |
Sort-Object -Descending LastWriteTime).Name -match '^\d+\.\d+$'
-Directory
- 限制与目录的匹配 - 取代单独的? { $_.PSIsContainer }
管道段。
通配符模式[0-9]*
限制匹配名称 start 且带有数字的目录。不幸的是,通配符表达式不够复杂,不能强制执行可变长度文件名完全由数字和句点组成 - 除非您愿意假设固定长度;例如,[0-9][0-9].[0-9]
匹配10.0
之类的内容
如果你不能做出这个假设,那么通过-match
的后期基于正则表达式的过滤步骤可以让你排除误报;然后你不需要预先匹配通配符,但是限制潜在的匹配会更有效。
(...).Name
使用成员枚举来收集数组中随附命令返回的所有对象的.Name
属性值。
-match '^\d+\.\d+$'
然后使用正则表达式过滤数组,只包含10.0
等名称 - 根据需要进行调整。
PSv2 等价物:
$array = (Get-ChildItem "C:\Program Files\Tableau\Tableau Server\[0-9]*" |
? { $_.PSIsContainer } |
Sort-Object -Descending LastWriteTime | % { $_.Name }) -match '^\d+\.\d+$'
Ansgar Wiechers建议使用以下变体,它会消除单独的-match
操作,并且更简单地匹配名称,而不是排除文件夹至少包含一(英文)信:
$array = Get-ChildItem "C:\Program Files\Tableau\Tableau Server\[0-9]*" |
? { $_.PSIsContainer -and $_.Name -notmatch '[a-z]' } |
Sort-Object -Descending LastWriteTime | % { $_.Name }