重命名文件已存在于PowerShell中

时间:2016-06-07 10:31:29

标签: powershell recursion

我创建了ps脚本,只复制文件夹结构中的文件 - 递归

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

1 个答案:

答案 0 :(得分:0)

这是一个解决方案,我使用Group-Object cmdlet按文件名对所有项目进行分组。然后我遍历每个组,如果该组包含多个文件,我将_$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 } } 从1开始并递增:

-File

注意: 如果PowerShell版本不支持,您可以将-Container:$false更改为 A B C User UserID Area 。另请注意,脚本不会查看目标文件夹是否已存在具有相同名称的文件。