2

私は基本的に次のことを行うスクリプトを書いています:

テキストファイルからいくつかの引数を読み取ります。

DriveLetter ThreeLetterCode ServerName VolumeLetter Integer

例えば。W MSS SERVER01 C 1

これらの値は、フォルダの宛先W:\MSS\と、次の命名規則で機能するファイル名を形成します。

SERVERNAME_VOLUMELETTER_VOL-b00X-iYYY.spi - Where The X is the Integer above

値YIは、後でインクリメンタルイメージ(バックアップ)の値であり、最新のインクリメンタルを計算する必要があるため、後で計算する必要があります。

したがって、現時点では->ファイル内の行をカウントし、この数の行をループします。

$lines = Get-Content -Path PostBackupCheck-Textfile.txt  | Measure-Object -Line
for ($i=0; $i -le $lines.Lines; $i++)

このループ内で、現在見ている行、つまり行0、行1、行2を読み取るために、Get-Contentを実行する必要があります。これは、最初に書いた形式で複数の行があり、行をに分割するためです。上記の命名規則に見られるように、ファイルの各部分がa [0]、a [1]、a[2]にある配列。等

これは、これらを含むフォルダーを日付で並べ替え、最新のファイルを日付で並べ替え、その_iXXX.spi部分を配列値に配置しa[X]て、マウントする完全なファイル名を取得する必要があるためです。この値は置き換えられますiYYY.spi

Get-ChildItemを-Includeで実行する場合は、すべてを日付で並べ替える前に確認する必要があるため、少し複雑です。テキストファイルから指定された引数に一致するファイル名のみを含めます。

それで、

SERVER01_C_VOL-b001-iYYY.spi and not anything else. 
i.e. not  SERVER01_D_VOL-b001-iYYY.spi

次に、Get-ChildItem -Includeの並べ替えからiYYY値を取得し、それを適切な配列項目に配置します。

文字通りどこから始めればいいのかわからないので、どんなアイデアでも大歓迎です!

うまくいけば、私は十分に詳細に説明しました。また、Pastebinにコードを配置しました:http://pastebin.com/vtFifTW6

4

1 に答える 1

3

これはそれほど複雑である必要はありません。簡単なパイプラインを使用して、ファイル内の行を操作することから始めることができます。

Get-Content PostBackupCheck-Textfile.txt |
  Foreach-Object {
    $drive, $folder, $server, $volume, [int]$i = -split $_
    ...
  }

ループ内の行は、現在の入力行をスペースで分割し、適切な変数を割り当てます。これにより、そこで配列を処理する手間が省けます。続くすべては、同様に上記のループにある必要があります。

次に、ファイル名パターンを作成できます。

$filename = "$server_$drive_VOL-b$($i.ToString('000'))-i*.spi"

これを使用して、すべてのフィッティングファイルを検索し、日付で並べ替えることができます。

$lastFile = Get-ChildItem $filename | sort LastWriteTime | select -last 1
于 2012-11-18T16:50:26.750 に答える