Powershell: попытка переименовать дубликаты файлов при использовании copy-item, но даже недубликаты переименовываются - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь скопировать файлы в новый каталог на основе их расширения и переименовывать дубликаты файлов, добавляя число к исходному имени файла.

Однако, когда я запускаю приведенный ниже скрипт (I 'мы включили весь сценарий, который выполняет другие действия, только для контекста), файлы, которые не дублируются, копируются дважды, а файлы, которые дублируются, копируются четыре раза.


Ex)

подпапка A содержит: aaa.doc, bbb.doc

подпапка B содержит: bbb.doc, ccc.doc

Я хочу, чтобы новый каталог имел: aaa.doc, bbb_1.doc, bbb_2.doc, ccc.doc

Однако я получаю: aaa.doc, aaa_1.doc, bbb.doc, bbb_1.doc, bbb_1_1.doc, bbb_2.doc, ccc.doc, ccc_1.doc


Похоже, мой скрипт обрабатывает все файлы дважды - почему он это делает и как я могу это исправить?

Мой сценарий (игнорировать первую часть):

New-Item -ItemType directory -Force -Path $PSScriptRoot\doc;

New-Item -ItemType directory -Force -Path $PSScriptRoot\txt;

New-Item -ItemType directory -Force -Path $PSScriptRoot\spreadsheet;


Get-ChildItem $PSScriptRoot -recurse | %{ 

if($_.Name -match "^*.`.gz$")
{
    $parent="$(Split-Path $_.FullName -Parent)";    
    #write-host "Extracting $($_.FullName) to $parent"

    $arguments=@("e", "`"$($_.FullName)`"", "-o`"$($parent)`"", "-y");
    $ex = start-process -FilePath "`"C:\Program Files\7-Zip\7z.exe`"" -ArgumentList $arguments -wait -PassThru;

    if( $ex.ExitCode -eq 0)
    {
       write-host "Extraction successful for $($_.FullName)"
   add-content -value "Extraction successful for $($_.FullName)" -path $PSScriptRoot\log_other.txt
       rmdir -Path $_.FullName -Force
    }
}
У этого чанка есть проблемы:
ElseIf(($_.Name -match "^*.`.doc$") -or ($_.Name -match "^*.`.docx$"))
{
$nextName = "$(Join-Path -Path $PSScriptRoot\doc -ChildPath $_.Name)";
If(Test-Path -Path $nextName)
{   
    $num = 1;
        while(Test-Path -Path $nextName)
        {
        $nextName = Join-Path $PSScriptRoot\doc ($_.BaseName + "_$num" + $_.Extension)    
        $num++  
    }
}
Else
{
    New-Item -ItemType File -Path $nextName -Force
}
$_ | Copy-Item -Destination $nextName -Force
    write-host "$($_.FullName) moved to doc folder"
add-content -value "$($_.FullName) moved to doc folder" -path $PSScriptRoot\log_other.txt
}
Конец проблемного чанка
ElseIf($_.Name -match "^*.`.txt$")
{
copy-item $_.FullName -destination $PSScriptRoot\txt
write-host "$($_.FullName) moved to txt folder"
add-content -value "$($_.FullName) moved to txt folder" -path $PSScriptRoot\log_other.txt
}


ElseIf(($_.Name -match "^*.`.xls$") -or ($_.Name -match "^*.`.xlsx$"))
{
copy-item $_.FullName -destination $PSScriptRoot\spreadsheet
write-host "$($_.FullName) moved to spreadsheet folder"
add-content -value "$($_.FullName) moved to spreadsheet folder" -path $PSScriptRoot\log_other.txt
}

}
...