2017-05-17 43 views
1

我想在多個路徑中使用數組運行下面的腳本。我的目標是刪除保留最後7個版本的文件夾,但不能按預期工作。該行動僅考慮到第一條路徑D:\Test1循環遍歷每個文件夾,並刪除其中的一些

我相信我應該在ForEach-Object之後加上($folders in $folders)之類的東西,但我不知道如何。

任何想法,我在這裏想念什麼?

$path = @("D:\Test1","D:\Test2","D:\Test3") 
$folders = Get-ChildItem -Path $path -Recurse | 
      Where-Object { $_.PSIsContainer } | 
      Group-Object { $_.Name.Split('_')[0] } | 
      ForEach-Object $Folders { 
      $_.Group | 
      sort CreationTime -Descending | 
      Select -Skip 7 | 
      foreach { Remove-Item $_.FullName -Force -WhatIf } 
      } 

回答

1

這應該做你的工作。

$path= @("D:\Test1","D:\Test2","D:\Test3") 
$folders= Get-ChildItem -path $path -Recurse | Where-Object {$_.PsIsContainer} |Group-Object {$_.FullName.Split('_')[0] } 
ForEach($folder in $folders) 
{ 
$folder.Group | sort CreationTime -Descending | Select -Skip 7|% { Remove-Item $_.fullname -Force -whatIf} 
} 

我在我的本地測試,它工作正常。雖然我沒有在你的代碼中得到任何錯誤,除了幾個格式化問題,我已經把它變成了變量並對其進行排序,因爲我糾結了太多的管道對象。

如果您在使用管道後使用foreach,這意味着它只會一個一個接管道對象。但是如果你單獨使用它,那麼你必須將每次迭代分配給一個變量。

希望它可以幫助你。

+0

謝謝,腳本看起來更好,但它仍然沒有按預期工作,我的意思是動作只考慮到第一個路徑「D:\ Test1」,現在正在刪除其他所有內容... 爲了以防萬一,我使用下面的腳本在兩個不同的路徑中創建測試文件夾: 1..10 | Foreach-Object {New-Item -ItemType Directory C:\ Users \ ad_karendex \ Documents \ TEST_1 \ Folder _「$ _」} 1..10 | Foreach-Object {New-Item -ItemType目錄C:\ Users \ ad_karendex \ Documents \ TEST_1 \ Test _「$ _」} – KarenD

+0

讓我檢查一下。 @Tana_CR –

+0

謝謝@Ranadip Dutta! – KarenD

0

我從@Robert Israelsson得到了答案!

「如果您將組對象更改爲不按名稱進行分組,而是使用全名,則將獲得所需的結果。」

來源:

$folders= Get-ChildItem -path $path -Recurse | Where-Object {$_.PsIsContainer} |Group-Object {$_.Name.Split('_')[0] } 

要:

$folders= Get-ChildItem -path $path -Recurse | Where-Object {$_.PsIsContainer} |Group-Object {$_.FullName.Split('_')[0] } 

這完美的作品!

相關問題