0

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)

私は だけを見たい、 だけを見たいSERVER1C_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 の番号、およびサーバー名を含めるにはどうすればよいですか?

4

1 に答える 1

1

SERVER1 だけを見て、C_VOL だけを見て、b001 だけを見て、他には何も見たくない。

これは包括的または排他的であることを意味していますか (質問は 100% 明確ではありません)。

すなわち。SERVER1 and C_VOL and ...ですか、それともそれらのいずれかに一致する任意のファイルですか? 最後の段落に基づいて、前者が必要なようです。

一致基準配列がファイル名 structuyre とどれだけ一致するかに応じて、2 つのアプローチがあります。

  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)
    
于 2012-11-18T10:56:23.810 に答える