使用PowerShell

时间:2016-10-03 12:13:52

标签: 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相同 - 它是管道中的实际指针。

2 个答案:

答案 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

相关问题