Test-Path cmdlet 仅对 20 个文件中的一个文件失败
Test-Path cmdlet fails only for one file out of 20
我想从文件夹结构中获取重复项并将它们全部复制到一个文件夹中,同时重命名(这样它们就不会被覆盖)。我希望重复组中的第一个文件用它的原始名称复制,其余的在名称末尾添加“_X”。
我写了一个几乎可以工作的代码,但在某些时候它只是覆盖了复制的第一个文件。只有一个文件被覆盖,其余文件按预期重命名和复制。
Get-ChildItem $SourcePath -Recurse -File -Force | Group-Object -Property Name | Where-Object {$_.Count -gt 1} | Select-Object -ExpandProperty Group |
ForEach-Object {
$SourceFile = $_.FullName
$FileName = $($_.BaseName + $_.Extension)
$DestFileName = Join-Path -Path $DestinationPath -ChildPath $FileName
if (Test-Path -Path $DestFileName) {
$DestinationFile = "$DestinationPath\" + $_.BaseName + "_" + $i + $_.Extension
$i+=1
} else {
$DestinationFile = $DestFileName
}
Copy-Item -Path $SourceFile -Destination $DestinationFile
}
我没有看到实际问题,但您可以在不使用 Test-Path
的情况下重写代码。也删除 Select-Object -ExpandProperty Group
,然后遍历每个组的元素。增加一个计数器并将其附加到除第一个文件之外的所有文件名。
Get-ChildItem $SourcePath -Recurse -File -Force | Group-Object -Property Name | Where-Object Count -gt 1 |
ForEach-Object {
$i = 0
foreach( $dupe in $_.Group ) {
$SourceFile = $dupe.FullName
$DestinationFile = Join-Path -Path $DestinationPath -ChildPath $dupe.BaseName
if( $i -gt 0 ) { $DestinationFile += "_$i" }
$DestinationFile += $dupe.Extension
Copy-Item -Path $SourceFile -Destination $DestinationFile
$i++
}
}
我想从文件夹结构中获取重复项并将它们全部复制到一个文件夹中,同时重命名(这样它们就不会被覆盖)。我希望重复组中的第一个文件用它的原始名称复制,其余的在名称末尾添加“_X”。
我写了一个几乎可以工作的代码,但在某些时候它只是覆盖了复制的第一个文件。只有一个文件被覆盖,其余文件按预期重命名和复制。
Get-ChildItem $SourcePath -Recurse -File -Force | Group-Object -Property Name | Where-Object {$_.Count -gt 1} | Select-Object -ExpandProperty Group |
ForEach-Object {
$SourceFile = $_.FullName
$FileName = $($_.BaseName + $_.Extension)
$DestFileName = Join-Path -Path $DestinationPath -ChildPath $FileName
if (Test-Path -Path $DestFileName) {
$DestinationFile = "$DestinationPath\" + $_.BaseName + "_" + $i + $_.Extension
$i+=1
} else {
$DestinationFile = $DestFileName
}
Copy-Item -Path $SourceFile -Destination $DestinationFile
}
我没有看到实际问题,但您可以在不使用 Test-Path
的情况下重写代码。也删除 Select-Object -ExpandProperty Group
,然后遍历每个组的元素。增加一个计数器并将其附加到除第一个文件之外的所有文件名。
Get-ChildItem $SourcePath -Recurse -File -Force | Group-Object -Property Name | Where-Object Count -gt 1 |
ForEach-Object {
$i = 0
foreach( $dupe in $_.Group ) {
$SourceFile = $dupe.FullName
$DestinationFile = Join-Path -Path $DestinationPath -ChildPath $dupe.BaseName
if( $i -gt 0 ) { $DestinationFile += "_$i" }
$DestinationFile += $dupe.Extension
Copy-Item -Path $SourceFile -Destination $DestinationFile
$i++
}
}