Keep/Rename 带副本的重复项
Keep/Rename Duplicate Items with Copy
我有一个 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
}
}
我现在正在寻找一种在函数内处理重复文件名的好方法。 "handle" 我的意思是如果目标目录中已存在具有该文件名的文件,则通过在文件名中添加一个数字来逐步更改文件名。
我在搜索中遇到了这个:
$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
或其他)也是可以接受的,只要它既能使目录结构扁平化又能很好地处理重复文件名(请参阅上面 "well" 的定义)。
多亏了我在问这个问题时收到的建议,我发现我犯了一些简单的错误,我只需要稍微改进一下脚本。
更正后的脚本如下。到目前为止,它已经对较小的数据集进行了处理。我将很快在一些更大的目录上测试它!
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\
我有一个 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
}
}
我现在正在寻找一种在函数内处理重复文件名的好方法。 "handle" 我的意思是如果目标目录中已存在具有该文件名的文件,则通过在文件名中添加一个数字来逐步更改文件名。
我在搜索中遇到了这个:
$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
或其他)也是可以接受的,只要它既能使目录结构扁平化又能很好地处理重复文件名(请参阅上面 "well" 的定义)。
多亏了我在问这个问题时收到的建议,我发现我犯了一些简单的错误,我只需要稍微改进一下脚本。
更正后的脚本如下。到目前为止,它已经对较小的数据集进行了处理。我将很快在一些更大的目录上测试它!
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\