我想用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
相同 - 它是管道中的实际指针。
答案 0 :(得分: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++
}
}
答案 1 :(得分: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