Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Копирование папок, с сравнением и переименованием

Ответить
Настройки темы
PowerShell - Копирование папок, с сравнением и переименованием

Новый участник


Сообщения: 46
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:31, 28-10-2020

 

(*.*)


Сообщения: 36489
Благодарности: 6675

Профиль | Сайт | Отправить PM | Цитировать


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

-------
Канал Windows 11, etc | Чат @winsiders

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:19, 29-10-2020 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 46
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 17:38, 29-10-2020 | #3


(*.*)


Сообщения: 36489
Благодарности: 6675

Профиль | Сайт | Отправить PM | Цитировать


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

-------
Канал Windows 11, etc | Чат @winsiders

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:22, 30-10-2020 | #4


Новый участник


Сообщения: 46
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 13:50, 30-10-2020 | #5


(*.*)


Сообщения: 36489
Благодарности: 6675

Профиль | Сайт | Отправить PM | Цитировать


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

-------
Канал Windows 11, etc | Чат @winsiders

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:03, 30-10-2020 | #6


Новый участник


Сообщения: 46
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 16:46, 30-10-2020 | #7


Новый участник


Сообщения: 46
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 18:08, 02-11-2020 | #8


Старожил


Сообщения: 280
Благодарности: 72

Профиль | Отправить PM | Цитировать


Как то так
Код: Выделить весь код
$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
}

Отправлено: 09:20, 18-11-2020 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Копирование папок, с сравнением и переименованием

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Копирование файла в кучу разных папок с переименованием его имени в имя папки. Bagsya Скриптовые языки администрирования Windows 26 27-05-2020 21:44
CMD/BAT - [решено] bat перемещение из всех вложенных папок в корневую с переименованием strel9 Скриптовые языки администрирования Windows 3 13-11-2018 18:46
VBS/WSH/JS - [решено] Копирование с переименованием pzh2393 Скриптовые языки администрирования Windows 1 05-12-2017 22:21
CMD/BAT - Копирование с переименованием и выставлением даты и время Сержа Скриптовые языки администрирования Windows 2 15-08-2013 15:01
CMD/BAT - [решено] Копирование каталога с исключениями и переименованием Hollou Скриптовые языки администрирования Windows 19 21-03-2012 16:12




 
Переход