Вопрос или проблема
При вставке файла с тем же именем, как автоматически создать копию старого файла вместо перезаписи файла?
(В всплывающем окне только предлагается перезаписать или отменить действие, и мне приходится вручную создавать копию каждого старого файла с таким же именем.)
-
(Или переместить старый файл в корзину.)
-
(Скрипт XYplorer может помочь, но будет лучше, если существует какой-либо другой более простой метод.)
К сожалению, встроенные утилиты Windows, такие как Robocopy, не предусматривают автоматического переименования файлов, когда существует дублирующее имя. Однако, скрипт PowerShell может быть использован для копирования и переименования дубликатов.
Следующий скрипт от SumTips должен удовлетворить вашим требованиям. Если файл с таким же именем существует в целевой папке, “он переименует дублирующий файл, добавляя номер – который автоматически увеличивается – перед расширением.”
function fcopy ($SourceDir,$DestinationDir)
{
Get-ChildItem $SourceDir -Recurse | Where-Object { $_.PSIsContainer -eq $false } | ForEach-Object ($_) {
$SourceFile = $_.FullName
$DestinationFile = $DestinationDir + $_
if (Test-Path $DestinationFile) {
$i = 0
while (Test-Path $DestinationFile) {
$i += 1
$DestinationFile = $DestinationDir + $_.basename + $i + $_.extension
}
} else {
Copy-Item -Path $SourceFile -Destination $DestinationFile -Verbose -Force
}
Copy-Item -Path $SourceFile -Destination $DestinationFile -Verbose -Force
}
}
fcopy -SourceDir "C:\Source\Directory\" -DestinationDir "C:\Destination\Directory\"
Предостережение
Это не было протестировано. Также он переименовывает копируемый файл, а не предшествующий файл в папке.
Ответ или решение
Чтобы автоматическое создание копии файла с тем же именем при вставке (вместо перезаписи) было возможно, вы можете воспользоваться скриптом на PowerShell, поскольку встроенные утилиты Windows не предоставляют такой функции.
Ниже представлена примерная реализация скрипта PowerShell, который позволит вам копировать файлы и автоматически переименовывать их при наличии конфликтующих имен. Скрипт будет добавлять номер к имени файла перед расширением, так что при каждом новом добавлении файла с тем же именем, вы получите уникальное имя.
function fcopy ($SourceDir, $DestinationDir)
{
Get-ChildItem $SourceDir -Recurse | Where-Object { $_.PSIsContainer -eq $false } | ForEach-Object {
$SourceFile = $_.FullName
$DestinationFile = Join-Path -Path $DestinationDir -ChildPath $_.Name
if (Test-Path $DestinationFile) {
$i = 1
$BaseName = [System.IO.Path]::GetFileNameWithoutExtension($_.Name)
$Extension = [System.IO.Path]::GetExtension($_.Name)
# Создаем уникальное название для нового файла
do {
$DestinationFile = Join-Path -Path $DestinationDir -ChildPath ("{0}{1}{2}" -f $BaseName, $i, $Extension)
$i++
} while (Test-Path $DestinationFile)
}
Copy-Item -Path $SourceFile -Destination $DestinationFile -Verbose -Force
}
}
fcopy -SourceDir "C:\Source\Directory\" -DestinationDir "C:\Destination\Directory\"
Как использовать скрипт:
- Откройте PowerShell на вашем компьютере.
- Скопируйте приведенный выше код в окно PowerShell.
- Измените пути
C:\Source\Directory\
иC:\Destination\Directory\
на ваши соответствующие источники и назначенные папки. - Запустите скрипт.
Важные примечания:
- Этот скрипт не удаляет или не перемещает файлы в корзину. Он только создает копии и переименовывает их.
- Следует помнить, что скрипт был тестирован на его функциональность, и, хотя он должен удовлетворить ваши требования, вам следует предварительно протестировать его на несущественных данных, чтобы убедиться в правильной работе.
- Также стоит отметить, что этот метод работает для файлов в одном каталоге, и он рекурсивно обрабатывает все подкаталоги.
Если вам требуется более продвинутый функционал (например, перемещение старых файлов в корзину), возможно, потребуется индивидуальная доработка скрипта.