2012-01-18 14 views
2

私はディレクトリ構造を調べ、各サブディレクトリにファイルの最新の7つのコピーを保存する方法について以前に質問しました。以下のスクリプトは作成されたものであり、うまく機能しますが、1つのディレクトリのみで動作します。私はディレクトリ全体を調べ、各サブディレクトリに最新の7つのファイルを保存する必要があります。x個のファイルを残して他のファイルをすべて削除する - 第2部

テストするには、Test1、Test2、Test3というサブディレクトリを持つC:\ Customerディレクトリ構造を作成しました。次に、トップレベルのC:\ Customerを含む各ディレクトリに12個のテストファイルを作成しました。ファイルの名前はTest1_Report_.txt - Test12です。下のスクリプトを実行すると、トップレベルのTest1、Test2のすべてのファイルが削除され、最新の7つのコピーがTest3に保存されました。私はここで何が欠けていますか?どんな助けでも大歓迎です。

$path = "C:\Customer" 


$files = Get-ChildItem -Path $path -Recurse | Where-Object {-not $_.PsIsContainer} |where{$_.name -like "*_Report_*"} 
$keep = 7 
if ($files.Count -gt $keep) { 
    $files |Sort-Object CreationTime |Select-Object -First ($files.Count - $keep)| Remove-Item -Force 
} 
+0

ディレクトリと_all_サブディレクトリから一度に_all_ファイルが取得され(!)、_all_個のファイルが7個保持されます。 Andyによって提案されているように、自分自身のために各フォルダをチェックする必要があります – Tom

答えて

0

未テストですが、これは必要なことをすると思います。これにより、すべてのディレクトリが処理され、最新の7つのファイルが各サブディレクトリに保存されます。

$path = "C:\Customer" 
$keep = 7 

$dirs = Get-ChildItem -Path $path -Recurse | Where-Object {$_.PsIsContainer} 
foreach ($dir in $dirs) { 
    $files = Get-ChildItem -Path $dir.FullName | Where-Object {-not $_.PsIsContainer -and $_.name -like "*_Report_*"} 
    if ($files.Count -gt $keep) { 
     $files | Sort-Object CreationTime | Select-Object -First ($files.Count - $keep) | Remove-Item -Force 
    } 
} 
+0

ありがとうございます。それがトリックでした。以前はforeachを使ってみましたが、問題の原因となっていたファイル名で使用していました。私は助けに感謝します。 – mpowmap

+0

@mpowmapようこそ。 –

関連する問題