使用复制保留/重命名重复项目

时间:2017-10-26 20:32:30

标签: powershell duplicates copy directory-structure

我有一个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或其他)也是可以接受的,只要它既可以平整目录结构又能很好地处理重复的文件名(请参阅&#34的定义;以及#34;以上内容)。 / p>

1 个答案:

答案 0 :(得分:0)

感谢我在提出这个问题时收到的建议,我发现我做了一些简单的错误,我只需要更多地改进脚本。

更正后的脚本如下。到目前为止,它已经对较小的数据集进行了处理。我很快就会在一些较大的目录上进行测试!

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\