Сохранить / переименовать дубликаты с копией

У меня есть сценарий PowerShell, который выравнивает структуру каталогов и копирует все файлы, содержащиеся в нем.

ls $srcdir -Recurse | Where-Object {
    $_.PSIsContainer -eq $false
} | foreach($_) {
    cp $_.Fullname $destdir -Force -Verbose
}

Затем я взял это и включил в работу.

function mcopy($srcdir, $destdir) {
    ls $srcdir -Recurse | Where-Object {
        $_.PSIsContainer -eq $false
    } | foreach($_) {
        cp $_.Fullname $destdir -Force -Verbose
    }
}

Сейчас я ищу хороший способ обработки дубликатов имен файлов в функции. Под "дескриптором" я подразумеваю постепенное изменение имени файла путем добавления числа к имени файла, если файл с таким именем уже существует в каталоге назначения.

Я наткнулся на это в моих поисках:

$SourceFile = "C:\Temp\File.txt"
$DestinationFile = "C:\Temp\NonexistentDirectory\File.txt"

if (Test-Path $DestinationFile) {
    $i = 0
    while (Test-Path $DestinationFile) {
        $i += 1
        $DestinationFile = "C:\Temp\NonexistentDirectory\File$i.txt"
    }
} else {
    New-Item -ItemType File -Path $DestinationFile -Force
}

Copy-Item -Path $SourceFile -Destination $DestinationFile -Force

Я пытаюсь объединить понятия в обоих этих сценариях, но пока мне это не удалось.

function mcopy($srcdir, $destdir) {
    ls $srcdir -Recurse | Where-Object {
        $_.PSIsContainer -eq $false
    } | foreach($_) {
if (Test-Path $_.fullname) {
    $i = 0
    while (Test-Path $_.fullname) {
        $i += 1
        $DestinationFile = "C:\Temp\NonexistentDirectory\File$i.txt"
    }
} else {
    New-Item -ItemType File -Path $_.fullname -Force
}

Copy-Item -Path $SourceFile -Destination $_.fullname -Force
    }
}    

Я думаю, что упускаю что-то очевидное или я сделал что-то явно неправильное из-за недоразумения где-то.

Рабочие заменители растворов (robocopy или другое) также допустимо, если оно одновременно выравнивает структуру каталогов и хорошо обрабатывает дубликаты имен файлов (см. определение "хорошо" выше).

1 ответ

Решение

Благодаря совету, который я получил, задавая этот вопрос, я обнаружил, что совершил несколько простых ошибок, и мне просто нужно было немного усовершенствовать сценарии.

Исправленный скрипт ниже. До сих пор он работал на небольших наборах данных. Скоро я опробую его на более крупных каталогах!

function mcopy($srcdir,$destdir)
{
ls $srcdir -recurse | Where-Object { $_.PSIsContainer -eq $false } | foreach($_) {
$SourceFile = $_.FullName
$DestinationFile = $destdir+$_
If (Test-Path $DestinationFile) {
    $i = 0
    While (Test-Path $DestinationFile) {
        $i += 1
        $DestinationFile = $destdir+$_+$i
    }
} Else {
    New-Item -ItemType File -Path $DestinationFile -Force
}
Copy-Item -Path $SourceFile -Destination $DestinationFile -verbose -Force
}
}

mcopy -srcdir C:\copyme\ -destdir C:\copyharder\
Другие вопросы по тегам