Войти

Показать полную графическую версию : Копирование папок, с сравнением и переименованием


ownsmir
28-10-2020, 15:31
Добрый день, Великие умы.
Почти дописал скрипт, но столкнулся с проблемой, не знаю как решить.
Дано:
Есть папка 1 - в которой создаются новые папки (по 1-10 шт в день), старые (вчерашние) удаляю.
Есть задача эти файлы скопировать в другую папку 2 (типа бэкап), но есть одно НО. В папке 2 могут быть папки с таким же наименованием. Robocopy тупо внутри папки заменяет файлы, это не допустимо.
Соответственно задача, из папки 1 скопировать файлы в папку 2, но если будет совпадение папки (пок) по наименованию, переименовать по шаблону ".000 +1" в конце файла. И переименовывать +1 пока не закончатся совпадения.
-----------Папка 1-----Папка 2----Есть совпадение в папке 2---Папка 1-----Папка 2-----Есть совпадение в папке 2---Папка 1-----Папка 2
Пример: sdfsdf.000 -> sdfsdf.000 --->переименовываем +1 -> sdfsdf.001 -> sdfsdf.001 - переименовываем +1 -> sdfsdf.002 -> sdfsdf.001 - нет совпадения копируем.
Как то так

Vadikan
29-10-2020, 16:19
Почти дописал скрипт »
Мы его почти увидели.
Есть папка 1 - в которой создаются новые папки (по 1-10 шт в день), старые (вчерашние) удаляю.
Есть задача эти файлы скопировать в другую папку 2 (типа бэкап) »
Пытался понять, но не смог. Если задача (а не хотелка) ежедневно резервировать папку, удаляя при этом вчерашнюю, то непонятно, что мешает именно это и делать без плясок с переименованием.

ownsmir
29-10-2020, 17:38
Мы его почти увидели. »
=)) Исходя из этого, поясню проще)
Выпускаются ЭЦП, грубо говоря в папку 1. После скрипт производит переменование ключей по шаблону средствами csptest.exe. После переименования, наименование папок так же генерируется, но бывают совпадения в наименованиях (с учетом что выпуск происходит всегда в пустую папку, csptest.exe не видит предыдущих наименований или хз честно по какому принципу он генерирует название). Так вот по этому это задача а не хотелка. При копировании переименованных ключей (новых) к старым (хранилище так сказать) robocopy тупо в папке с одинаковым названием либо заменяет содержимое на новое (что не допустимо) либо дополнит новыми файлами (что так же недопустимо). Папки в хранилище "Папка2" неприкасаемы) их можно только дополнять новыми папками с измененными этими 3 цифрами в конце "+1"

Vadikan
30-10-2020, 13:22
ownsmir, вы путатесь в показаниях. Сначала речь шла про переименование файлов, теперь про переименование папок.

В общем, как-то так на примере двух папок (не рекурсивно) и переименования файлов

$source = "C:\test\source"
$target= "C:\test\target"

dir $source | %{
$file = $_.Name
If (Test-Path $target\$file) {
$i = 0
While (Test-Path $target\$file) {
$i += 1
$file = $file+$i
}
}
Else {
New-Item -ItemType File -Path $target\$file -Force -Whatif
}
Copy-Item -Path $_.FullName -Destination $target\$file -Force -Whatif
}

Для каждого файла в источнике проверяем, есть ли файл с таким именем в целевой папке.
- Если есть, добавляем к расширению файла 1 и снова проверяем наличие уже такого файла. И так до тех пор, пока не избавимся от совпадения.
- Если такого файла нет, создаем его
В конце перезаписываем созданный файл из источника.

До
[PS <159> C:\…\Scripts] dir $source; dir $target


Directory: C:\test\source

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 30.10.2020 13:14 8 01.txt
-a--- 30.10.2020 13:15 8 02.txt
-a--- 30.10.2020 13:15 8 03.txt

Directory: C:\test\target

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 30.10.2020 13:09 5 01.txt
-a--- 30.10.2020 13:17 5 02.txt

Операция с whatif
[PS <160> C:\…\Scripts] .\copy-rename.ps1
What if: Performing the operation "Copy File" on target "Item: C:\test\source\01.txt Destination: C:\test\target\01.txt1".
What if: Performing the operation "Copy File" on target "Item: C:\test\source\02.txt Destination: C:\test\target\02.txt1".
What if: Performing the operation "Create File" on target "Destination: C:\test\target\03.txt".
What if: Performing the operation "Copy File" on target "Item: C:\test\source\03.txt Destination: C:\test\target\03.txt".

После (операция без whatif)
[PS <162> C:\…\Scripts] dir $source; dir $target


Directory: C:\test\source

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 30.10.2020 13:14 8 01.txt
-a--- 30.10.2020 13:15 8 02.txt
-a--- 30.10.2020 13:15 8 03.txt

Directory: C:\test\target

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 30.10.2020 13:09 5 01.txt
-a--- 30.10.2020 13:14 8 01.txt1
-a--- 30.10.2020 13:17 5 02.txt
-a--- 30.10.2020 13:15 8 02.txt1
-a--- 30.10.2020 13:15 8 03.txt

ownsmir
30-10-2020, 13:50
вы путатесь в показаниях. Сначала речь шла про переименование файлов, теперь про переименование папок. »
Да извиняюсь пока писал опечатался)) как раз файлы трогать вообще нельзя) только папки)
Перефразирую "задача, из папки 1 скопировать все папки в папку 2, но если будет совпадение папки (пок) по наименованию, переименовать по шаблону ".000 +1" в конце наименования папки. И переименовывать +1 пока не закончатся совпадения.

Vadikan
30-10-2020, 14:03
Перефразирую »
Перефразируйте скрипт :) Идею я вам доставил

ownsmir
30-10-2020, 16:46
Перефразируйте скрипт :) Идею я вам доставил »
Я бы с радостью покавырялся и разобрался как и что тут перефразировать, если бы не дэдлайн)))
Но вроде все работает, за исключением того что он добавляет 1 к названию)) а не меняет последнюю цифру +1)

ownsmir
02-11-2020, 18:08
Перефразируйте скрипт :) Идею я вам доставил »
Хелп) Пожалуйста...

Molchune
18-11-2020, 09:20
Как то так
$source = "C:\tmp\source"
$target= "C:\tmp\target"
dir $source -Directory | %{

$folder = $_.Name
Test-Path $target\$folder

If (Test-Path $target\$folder) {
$i = 0
While (Test-Path -Path $target\$folder) {
$i += 1
$folder=$folder.Split(".")[0] + "." + ($i | %{"$_".padleft(3,'0')})
}
}

Else {
Copy-Item -Path $_.FullName -Recurse -Destination $target\$folder #-Force -Whatif
}
Copy-Item -Path $_.FullName -Recurse -Destination $target\$folder #-Force -Whatif
}




© OSzone.net 2001-2012