在PowerShell中使用-Include过滤器中的变量

时间:2012-11-17 23:34:22

标签: powershell

我有一个使用Get-ChildItem来计算文件夹中最新文件的函数。我需要在文件夹中找到最新的增量备份并编写EXE文件脚本来安装它。但是,在同一文件夹中,所有不同服务器都有多个备份链,即

SERVER1_C_VOL_b001_i015.spi
SERVER2_D_VOL_b001_i189.spi
SERVER1_C_VOL_b002_i091.spi
SERVER1_E_VOL_b002_i891.spi (This is the newest file created)

我只想查看SERVER1,只查看C_VOL并仅查看b001 - 没有别的。

我有所有这些单独的组件:驱动器号,服务器名称,存储在数组中的b00X号。

我怎样才能使用Get-ChildItem -Include过滤器来查看:

.spi
SERVER1
C_VOL
b001

鉴于我从文本文件中获取了所有这些单独的组件:

Get-Content .\PostBackupCheck-TextFile.txt | Select-Object -First $i { $a = $_ -split ' ' ; $locationArray += "$($a[0]):\$($a[1])\$($a[2])" ; $imageArray += "$($a[2])_$($a[3])_VOL_b00$($a[4])_i$($a[5]).spi" }

我继续尝试并过滤,然后我卡住了:

$latestIncremental = Get-ChildItem -Path ${shadowProtectDataLocation}\*.* -Include *.spi | Sort-Object LastAccessTime -Descending | Select-Object -First 1 

我已经过了.spi过滤了,但是我怎样才能包含C(用于卷),b00x的编号和服务器名称?

1 个答案:

答案 0 :(得分:1)

  

我只想查看SERVER1,只查看C_VOL并仅查看b001 - 没有别的。

这是否具有包容性或排他性(问题不是100%明确)?

IE中。它是SERVER1 C_VOL ...,还是与其中任何一个匹配的文件?根据最后一段,你似乎想要前者。

我看到两种方法,具体取决于匹配条件数组与文件名structuyre的匹配程度。

  1. 如果您的匹配文件具有与过滤条件匹配的表单(例如,在Q的示例中,除了扩展名之外具有相同的名称组件顺序),那么您可以动态构建“类似模式”:

    $parts = … # the match parts array
    $pattern = (($parts | Select-Object -skip 1) -join '*') + $parts[0]
    $file = Get-ChildItem -Path $basePath -include $pattern | Sort-Object …
    
  2. 逐步应用模式的每个部分,再次假设扩展名在文件中首先出现:

    $parts = … # the match parts array
    $potentialFiles = Get-ChildItem -Path $basePath -include ('*' + $parts[0])
    $parts = $parts | Select-Object -skip 1
    foreach ($p in $parts) {
      $potentialFiles = $potentialFiles | Where-Objecft { $_.Name -like ('*' + $p + '*') }
    }
    # Now sort and select -first 1 to get single file (if any left to match)