2016-06-07 4 views
0

Я создал пс скрипт для копирования только файлы в папке структурообразующих рекурсивнойRename, если файл уже существует в PowerShell

cp $source.Text -Recurse -Container:$false -destination $destination.Text 
$dirs = gci $destination.Text -directory -recurse | Where { (gci $_.fullName).count -eq 0 } | select -expandproperty FullName 
$dirs | Foreach-Object { Remove-Item $_ } 

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

источник:

folderA--> xxx.txt,yyy.txt, 
folderB-->xxx.txt,yyy.txt,zzz.txt, 
folderc-->xxx.txt 

назначения (требование)

xxx.txt 
xxx1.txt 
xxx2.txt 
yyy.txt 
yyy1.txt 
zzz.txt 

ответ

0

Вот решение, в котором я использую Group-Object Командлет сгруппировать все элементы по имени файла. Затем я итерацию по каждой группе и, если группа содержит более одного файла, я прилагаю _$i к нему, где $i начинается с одного и получает приращение:

$source = $source.Text 
$destination = $destination.Text 


Get-ChildItem $source -File -Recurse | Group-Object Name | ForEach-Object { 
    if ($_.Count -gt 1) { # rename duplicated files 
     $_.Group | ForEach-Object -Begin {$i = 1} -Process { 
      $newFileName = $_.Name -replace '(.*)\.(.*)', "`$1_$i.`$2" 
      $i++ 
      Copy-Item -Path $_.FullName -Destination (Join-Path $destination $newFileName)    
     } 
    } 
    else # the filename is unique, just copy it. 
    { 
     $_.Group | Copy-Item -Destination $destination 
    } 
} 

Примечание: Вы можете изменить -File к -Container:$false, если ваш PowerShell версия не поддерживает его. Также обратите внимание, что сценарий не смотрит в папку назначения, существует ли файл с тем же именем.

Смежные вопросы