CMD/BAT - [решено] Батник для двойной сортировки и переименования

Аватара пользователя
Nun-Nun

CMD/BAT - [решено] Батник для двойной сортировки и переименования

Сообщение Nun-Nun »

Нужен батник для следующей задачи: есть, например, куча разных хотфиксов для винды, причём каждый из хотфиксов расположен в отдельной папке, имеющей название, присвоенное по номеру и дате хотфикса. Нужно выполнить сортировку этих папок по дате и номеру с одновременным переименовыванием папок путём добавления в их название порядкового номера, затем перенести сами файлы хотфиксов из отдельных папок в одну общую папку, переименовывая при этом названия файлов путём добавления порядкового номера как у исходной папки. При этом сортировка папок хотфиксов должна выполняться в первую очередь по дате и затем по номеру хотфикса. Чтобы было понятнее поясню наглядно. Например, есть 5 папок с хотфиксами (номера взяты произвольно!): KB976453_(12-07-2009), KB2356788_(08-05-2010), KB849762_(03-02-2011), KB2345788_(18-05-2010), KB2545788_(22-05-2011). В результате работы батника должен получиться следующий перечень папок:



001_KB976453_(12-07-2009)

002_KB2356788_(08-05-2010)

003_KB2345788_(18-05-2010)

004_KB849762_(03-02-2011)

005_KB2545788_(22-05-2011)



После этого перечень файлов хотфиксов в общей папке должен получиться таким:



001_WindowsXP-KB976453-x86-RUS.exe

002_WindowsXP-KB2356788-x86-RUS.exe

003_WindowsXP-KB2345788-x86-RUS.exe

004_WindowsXP-KB849762-x86-RUS.exe

005_WindowsXP-KB2545788-x86-RUS.exe
Аватара пользователя
gora

Re: CMD/BAT - [решено] Батник для двойной сортировки и переименования

Сообщение gora »

Nun-Nun, о постановке задачи:

1 Скобки являются спец. символом в CMD и использование их в именах усложняет обработку таких имен. Лучше от них (скобок в именах) сразу отказаться.

2 Даты проще обрабатывать в формате YYYYMMDD, дабы потом не вырезать лишние тире и не переворачивать даты, переводя их в формат удобный для сравнения в CMD.
Аватара пользователя
Nun-Nun

Re: CMD/BAT - [решено] Батник для двойной сортировки и переименования

Сообщение Nun-Nun »

gora,



Пусть будет и с учётом Ваших замечаний, правда мне ооочень долго придётся переименовывать те папки, что уже есть (а их набралось уже несколько сотен), но это не самое страшное, главное увидеть, как такая задача решается. Изображение
Аватара пользователя
gora

Re: CMD/BAT - [решено] Батник для двойной сортировки и переименования

Сообщение gora »

Цитата Nun-Nun:



переименовыванием папок путём добавления в их название порядкового номера, затем перенести сами файлы хотфиксов из отдельных папок в одну общую папку
CMD/BAT - [решено] Батник для двойной сортировки и переименования




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

2 Команды "перенести" в CMD нет. Либо "скопировать", либо "переместить". Последнее опять чревато невозможностью повторного запуска батника.

3 Если "переместить", то в результате у Вас останется одна папка со всеми фиксами у которых будут новые имена и куча пустых папок с новыми именами. Зачем нужны эти пустые переименованные папки?

4 Скрипт предназначен для однократного использования? Тогда лучше отказаться от этой идеи совсем. ИМХО.
Аватара пользователя
Nun-Nun

Re: CMD/BAT - [решено] Батник для двойной сортировки и переименования

Сообщение Nun-Nun »

Цитата gora:



1 Зачем переименовывать исходные папки?
CMD/BAT - [решено] Батник для двойной сортировки и переименования




Прошу прощения, не совсем точно выразился: разумеется, речь шла не об исходниках папок с хотфиксами, а об их копиях, взятых для поставленной задачи, сами же исходники хранятся в архиве и никаких экспериментов я с ними не провожу. Работа по переименованию папок нужна не потому, что больше нечего делать, а для работы другого скрипта, просто делать это каждый раз для него вручную слишком долго. Но пусть это Вас не беспокоит, даже если будут пустые, но отсортированные и пронумерованные нужным образом папки мне этого достаточно.


Цитата:



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



Для повторной работы ему будет предоставлен новый нормальный неправленный набор папок с хотфиксами. Изображение
Цитата gora:



Если в дальнейшем будут добавляться папки с новыми фиксами, а устаревшие фиксы со своими папками будут удаляться, то порядковые номера всех папок нужно будет снова править и уже вручную
CMD/BAT - [решено] Батник для двойной сортировки и переименования




Добавляться и удаляться будут, но вручную и не в комплект обработанных батником, а в исходный архив. Батнику, как я уже говорил, будет для обработки предоставляться (из архива) необработанный комплект папок с хотфиксами, от него требуется только их подготовить в соответствии с поставленной задачей.


Цитата gora:



2 Команды "перенести" в CMD а нет. Либо "скопировать", либо "переместить".
CMD/BAT - [решено] Батник для двойной сортировки и переименования




Моя оплошность, не точно выразился, разумеется имелось в виду "скопировать". Изображение Но в принципе, пустые обработанные папки для повторной работы батника использоваться не будут, т.к. они - только источнок информации (дата и номер хотфикса) для него.


Цитата gora:



Скрипт предназначен для однократного использования?
CMD/BAT - [решено] Батник для двойной сортировки и переименования




Нет не для однократного! Я ведь потому и держу отдельный архив с хотфиксами! В архиве у меня находятся папки без сортировки, чтобы без заморочек можно было туда добавлять новые и удалять устаревшие.
Аватара пользователя
gora

Re: CMD/BAT - [решено] Батник для двойной сортировки и переименования

Сообщение gora »

Для папок формата:

KB849762_20110203

KB849768_20110203

KB976453_20090712

KB2345788_20100518

KB2356788_20100508

KB2545788_20110522

попробуйте так:

Код:

Код: Выделить всё

@Echo Off
SetLocal EnableDelayedExpansion
:: Папка с исходными папками фиксов
Set InFld=e:\Temp 1\1\1
:: Папка в которой будут созданы пустые папки со сквозной нумерацией (не понял зачем они, но пусть будет)
Set OutFld=e:\Temp 1\1\2
:: Папка в которую копируются переименованные файлы фиксов
Set allfix=e:\Temp 1\1\2\AllFix
For /F "UseBackQ Delims=" %%i In (`Dir "%InFld%" /B /AD /ON 2^>Nul`) Do (
	Set ti=%%i
	Set dat=!ti:~-8!
	Set kb=!ti:~0,-9!
	If "!ti:~8,1!"=="_" Set kb=!kb:~0,2!0!kb:~2!
	Set $!dat!!kb!=1
)
Set cnt=0
For /F %%i In ('Set $') Do (
	Set /A cnt +=1
	Set cnt0=00!cnt!
	Set ti=%%i
	Set kb=!ti:~9,9!
	If "!kb:~2,1!"=="0" Set kb=!kb:~0,2!!kb:~3!
	MD "%OutFld%\!cnt0:~-3!_!kb!_!ti:~1,8!" 2>Nul
	For %%f In ("%InFld%\!kb!_!ti:~1,8!\*.*") Do (
		Copy /Y "%InFld%\!kb!_!ti:~1,8!\%%~nxf" "%allfix%\!cnt0:~-3!_%%~nxf" >Nul
		Echo RD /S /Q "%InFld%\!kb!_!ti:~1,8!"	
	)
)
Аватара пользователя
Nun-Nun

Re: CMD/BAT - [решено] Батник для двойной сортировки и переименования

Сообщение Nun-Nun »

gora,



Взял произвольный набор хотфиксов:



KB2296199_20101213

KB2360131_20101012

KB2387149_20101011

KB2393802_20110207

KB2412687_20110411

KB2416400_20101213

KB2419632_20110110

KB2423089_20101213

KB2436673_20101213

KB2440591_20101213

KB2443105_20101213

KB2467659_20101210

KB2476687_20110207

KB2478960_20110207

KB2478971_20110207

KB2479628_20110207

KB2479943_20110307

KB2483185_20110207

KB2483614_20110307

KB2485376_20110207

KB2485663_20110411

KB2503658_20110411

KB2506212_20110411

KB2506223_20110411

KB2507618_20110411

KB2508272_20110411

KB2508429_20110411

KB2524375_20110322

KB931125_20101025



Вот что получилось с пустыми папками Изображение:



001_KB2387149_20101011

001_KB2440591_20101213

001_KB2483185_20110207

001_KB2506212_20110411

002_KB2360131_20101012

002_KB2443105_20101213

002_KB2485376_20110207

002_KB2506223_20110411

003_KB2419632_20110110

003_KB2479943_20110307

003_KB2507618_20110411

003_KB931125_20101025

004_KB2393802_20110207

004_KB2467659_20101210

004_KB2483614_20110307

004_KB2508272_20110411

005_KB2296199_20101213

005_KB2476687_20110207

005_KB2508429_20110411

005_KB2524375_20110322

006_KB2412687_20110411

006_KB2416400_20101213

006_KB2478960_20110207

007_KB2423089_20101213

007_KB2478971_20110207

007_KB2485663_20110411

008_KB2436673_20101213

008_KB2479628_20110207

008_KB2503658_20110411



Тоже самое и с порядковыми номерами файлов хотфиксов. Изображение



P.S.
Цитата:



:: Папка в которой будут созданы пустые папки со сквозной нумерацией (не понял зачем они, но пусть будет)



Я думал, что алгоритм работы батника будет построен таким образом, что сначала исходные папки сортируются-переименовываются, согласно исходной задаче, а потом из них копируются сами хотфиксы, переименованные в соответствии с порядковыми номерами отсортированных папок.
Аватара пользователя
gora

Re: CMD/BAT - [решено] Батник для двойной сортировки и переименования

Сообщение gora »

Nun-Nun, поправил, проверяйте



на Вашем наборе получил:

Код:

Код: Выделить всё

001_KB2387149_20101011
002_KB2360131_20101012
003_KB931125_20101025
004_KB2467659_20101210
005_KB2416400_20101213
006_KB2423089_20101213
007_KB2436673_20101213
008_KB2440591_20101213
009_KB2443105_20101213
010_KB2419632_20110110
011_KB2393802_20110207
012_KB2476687_20110207
013_KB2478960_20110207
014_KB2478971_20110207
015_KB2479628_20110207
016_KB2483185_20110207
017_KB2485376_20110207
018_KB2479943_20110307
019_KB2483614_20110307
020_KB2524375_20110322
021_KB2412687_20110411
022_KB2485663_20110411
023_KB2503658_20110411
024_KB2506212_20110411
025_KB2506223_20110411
026_KB2507618_20110411
027_KB2508272_20110411
028_KB2508429_20110411


Цитата Nun-Nun:



сначала исходные папки сортируются-переименовываются
CMD/BAT - [решено] Батник для двойной сортировки и переименования




Команды "переименовать" работает с файлами, но не с папками. Значит нужно сначала создать папку с новым именем, затем туда скопировать содержимое "переименовываемой" папки, а потом удалить исходную папку.
Аватара пользователя
Nun-Nun

Re: CMD/BAT - [решено] Батник для двойной сортировки и переименования

Сообщение Nun-Nun »

gora,



Проверил: пустые папки создались как положено с порядковой нумерацией, но с файлами хотфиксов ничего не происходит, общая выходная папка пуста. Изображение
Аватара пользователя
gora

Re: CMD/BAT - [решено] Батник для двойной сортировки и переименования

Сообщение gora »

Цитата Nun-Nun:



общая выходная папка пуста.
CMD/BAT - [решено] Батник для двойной сортировки и переименования




У меня она полна и все нормально. Приведите пути в первых строках Вашего батника:

Код:

Код: Выделить всё

Set InFld=e:\Temp 1\1\1
Set OutFld=e:\Temp 1\1\2
Set allfix=e:\Temp 1\1\2\AllFix

В папках фиксов в %InFld% есть фиксы? По одному в каждой папке? Список имен приведите.



Папка из переменной %allfix% до запуска скрипта создана? Она не создается скриптом...
Ответить

Вернуться в «Скриптовые языки администрирования Windows»