使用字母A-Z排除目录

时间:2017-11-22 12:30:19

标签: arrays powershell

使用下面的代码可以排除目录名中包含任何字符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"

1 个答案:

答案 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 }