Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Копирование папок, с сравнением и переименованием (http://forum.oszone.net/showthread.php?t=346861)

ownsmir 28-10-2020 15:31 2937903

Копирование папок, с сравнением и переименованием
 
Добрый день, Великие умы.
Почти дописал скрипт, но столкнулся с проблемой, не знаю как решить.
Дано:
Есть папка 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 2938055

Цитата:

Цитата ownsmir
Почти дописал скрипт »

Мы его почти увидели.
Цитата:

Цитата ownsmir
Есть папка 1 - в которой создаются новые папки (по 1-10 шт в день), старые (вчерашние) удаляю.
Есть задача эти файлы скопировать в другую папку 2 (типа бэкап) »

Пытался понять, но не смог. Если задача (а не хотелка) ежедневно резервировать папку, удаляя при этом вчерашнюю, то непонятно, что мешает именно это и делать без плясок с переименованием.

ownsmir 29-10-2020 17:38 2938064

Цитата:

Цитата Vadikan
Мы его почти увидели. »

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

Vadikan 30-10-2020 13:22 2938170

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 2938175

Цитата:

Цитата Vadikan
вы путатесь в показаниях. Сначала речь шла про переименование файлов, теперь про переименование папок. »

Да извиняюсь пока писал опечатался)) как раз файлы трогать вообще нельзя) только папки)
Перефразирую "задача, из папки 1 скопировать все папки в папку 2, но если будет совпадение папки (пок) по наименованию, переименовать по шаблону ".000 +1" в конце наименования папки. И переименовывать +1 пока не закончатся совпадения.

Vadikan 30-10-2020 14:03 2938179

Цитата:

Цитата ownsmir
Перефразирую »

Перефразируйте скрипт :) Идею я вам доставил

ownsmir 30-10-2020 16:46 2938202

Цитата:

Цитата Vadikan
Перефразируйте скрипт :) Идею я вам доставил »

Я бы с радостью покавырялся и разобрался как и что тут перефразировать, если бы не дэдлайн)))
Но вроде все работает, за исключением того что он добавляет 1 к названию)) а не меняет последнюю цифру +1)

ownsmir 02-11-2020 18:08 2938582

Цитата:

Цитата Vadikan
Перефразируйте скрипт :) Идею я вам доставил »

Хелп) Пожалуйста...

Molchune 18-11-2020 09:20 2940306

Как то так
Код:

$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
}



Время: 07:38.

Время: 07:38.
© OSzone.net 2001-