|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Копирование папок, с сравнением и переименованием |
|
PowerShell - Копирование папок, с сравнением и переименованием
|
Новый участник Сообщения: 46 |
Добрый день, Великие умы.
Почти дописал скрипт, но столкнулся с проблемой, не знаю как решить. Дано: Есть папка 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 |
(*.*) Сообщения: 36567
|
Профиль | Сайт | Отправить PM | Цитировать Цитата ownsmir:
Цитата ownsmir:
|
||
------- Отправлено: 16:19, 29-10-2020 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 46
|
Профиль | Отправить PM | Цитировать Цитата Vadikan:
![]() Выпускаются ЭЦП, грубо говоря в папку 1. После скрипт производит переменование ключей по шаблону средствами csptest.exe. После переименования, наименование папок так же генерируется, но бывают совпадения в наименованиях (с учетом что выпуск происходит всегда в пустую папку, csptest.exe не видит предыдущих наименований или хз честно по какому принципу он генерирует название). Так вот по этому это задача а не хотелка. При копировании переименованных ключей (новых) к старым (хранилище так сказать) robocopy тупо в папке с одинаковым названием либо заменяет содержимое на новое (что не допустимо) либо дополнит новыми файлами (что так же недопустимо). Папки в хранилище "Папка2" неприкасаемы) их можно только дополнять новыми папками с измененными этими 3 цифрами в конце "+1" |
|
Отправлено: 17:38, 29-10-2020 | #3 |
(*.*) Сообщения: 36567
|
Профиль | Сайт | Отправить 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 [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". [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 |
------- Отправлено: 13:22, 30-10-2020 | #4 |
Новый участник Сообщения: 46
|
Профиль | Отправить PM | Цитировать Цитата Vadikan:
Перефразирую "задача, из папки 1 скопировать все папки в папку 2, но если будет совпадение папки (пок) по наименованию, переименовать по шаблону ".000 +1" в конце наименования папки. И переименовывать +1 пока не закончатся совпадения. |
||
Отправлено: 13:50, 30-10-2020 | #5 |
(*.*) Сообщения: 36567
|
Профиль | Сайт | Отправить PM | Цитировать Цитата ownsmir:
|
|
------- Отправлено: 14:03, 30-10-2020 | #6 |
Новый участник Сообщения: 46
|
Профиль | Отправить PM | Цитировать Цитата Vadikan:
Но вроде все работает, за исключением того что он добавляет 1 к названию)) а не меняет последнюю цифру +1) |
|
Отправлено: 16:46, 30-10-2020 | #7 |
Новый участник Сообщения: 46
|
Профиль | Отправить PM | Цитировать Цитата Vadikan:
|
|
Отправлено: 18:08, 02-11-2020 | #8 |
Старожил Сообщения: 280
|
Профиль | Отправить 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 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|