2016-10-03 58 views
2

我想使用PowerShell來計算重複的文件。我的文件有一個特殊的分隔符('#'),我只能比較分隔符之前的部分。使用PowerShell計數重複

Mode  LastWriteTime Length Name 
----  ------------- ------ ---- 
-a---- 23.09.2016 09:44  0 AnotherDuplicateOffer_#1265473v1.DOCX 
-a---- 23.09.2016 09:44  0 AnotherDuplicateOffer_#89798798546v1.DOCX 
-a---- 23.09.2016 09:44  0 AnotherDuplicateOffer_#98769876v1.DOCX 
-a---- 23.09.2016 09:44  0 DuplicateOffer_#1254798v1.DOCX 
-a---- 23.09.2016 09:44  0 DuplicateOffer_#34987094587v1.DOCX 
-a---- 23.09.2016 09:44  0 DuplicateOffer_#4986598v1.DOCX 
-a---- 23.09.2016 09:44  0 DuplicateOffer_#567809v1.DOCX 
-a---- 23.09.2016 09:44  0 WordFilesAlthoug_#89798798546v1.DOCX

分隔符後的部分是一個唯一的ID,至少我想通過刪除這個ID來重命名這些文件。所以新文件名應該是'string(x).docx','x'應該是重複項的計數器。

我卡通過計算重複:

foreach ($file in (Get-ChildItem -Path $path -Recurse | Where {!$_.PSIsContainer})) { 
    $file.Name 
    $file.Name.IndexOf("#") 
    $file.Name.Substring(0, ($file.Name.IndexOf("#"))) 
    (dir *.* | group -Property Name | Where {($_.Name.Substring(0,($_.Name.IndexOf("#")))) -match ($_.Name.Substring(0,($_.Name.IndexOf("#"))))}).Count 
} 

我得到的「#」右手食指與$file.Name.IndexOf("#")並且還$file.Name.Substring(0,($file.Name.IndexOf("#")))字符串是正確的。但是當我在管道中使用相同的時候,由於第二部分,我在Substring中遇到了異常 - 它必須大於0並且它看起來是0或更小。

爲了更好地理解:$_$file相同 - 它是管道中的實際指針。

回答

3

只需按文件名的第一部分對文件進行分組,然後選擇具有多個元素的組。

Get-ChildItem -Path $path -Recurse | 
    Where-Object { -not $_.PSIsContainer } | 
    Group-Object { ($_.Name -split '#')[0] } | 
    Where-Object { $_.Count -ge 2 } 

通過單獨處理每個組重命名文件:

... | ForEach-Object { 
    $i = 0 
    $_.Group | ForEach-Object { 
     $newname = $_.Name -replace '#\d+v\d+', "($i)" 
     Rename-Item -Path $_.FullName -NewName $newname 
     $i++ 
    } 
} 
+0

謝謝你的工作。無論如何,我讓我的Probelm自己解決了。見上面的更新 – ludwigschuster

0

最後我得到它的工作。關鍵是給dir正確的道路。我第一次沒有這樣做,因爲我認爲這是我的指針$file,但事實並非如此。因此,使用參數-Path$file.Directory完成正確的路徑。這種方式dir得到了真正的$file所在的正確路徑。

(dir -Path $file.Directory *.* | group -Property Name | Where{($_.Name.Substring(0,($_.Name.IndexOf("#")))) -match ($_.Name.Substring(0,($_.Name.IndexOf("#"))))}).Count