Показать полную графическую версию : [решено] Батник для двойной сортировки и переименования
Нужен батник для следующей задачи: есть, например, куча разных хотфиксов для винды, причём каждый из хотфиксов расположен в отдельной папке, имеющей название, присвоенное по номеру и дате хотфикса. Нужно выполнить сортировку этих папок по дате и номеру с одновременным переименовыванием папок путём добавления в их название порядкового номера, затем перенести сами файлы хотфиксов из отдельных папок в одну общую папку, переименовывая при этом названия файлов путём добавления порядкового номера как у исходной папки. При этом сортировка папок хотфиксов должна выполняться в первую очередь по дате и затем по номеру хотфикса. Чтобы было понятнее поясню наглядно. Например, есть 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
Nun-Nun, о постановке задачи:
1 Скобки являются спец. символом в CMD и использование их в именах усложняет обработку таких имен. Лучше от них (скобок в именах) сразу отказаться.
2 Даты проще обрабатывать в формате YYYYMMDD, дабы потом не вырезать лишние тире и не переворачивать даты, переводя их в формат удобный для сравнения в CMD.
gora,
Пусть будет и с учётом Ваших замечаний, правда мне ооочень долго придётся переименовывать те папки, что уже есть (а их набралось уже несколько сотен), но это не самое страшное, главное увидеть, как такая задача решается. :)
переименовыванием папок путём добавления в их название порядкового номера, затем перенести сами файлы хотфиксов из отдельных папок в одну общую папку »
1 Зачем переименовывать исходные папки? Повторно запустить батник уже не получится, ибо имена папок будут иметь уже другой формат. Если в дальнейшем будут добавляться папки с новыми фиксами, а устаревшие фиксы со своими папками будут удаляться, то порядковые номера всех папок нужно будет снова править и уже вручную, т.к., часть из них добавится, а часть пропадет и в нумерации останутся "дыры".
2 Команды "перенести" в CMD нет. Либо "скопировать", либо "переместить". Последнее опять чревато невозможностью повторного запуска батника.
3 Если "переместить", то в результате у Вас останется одна папка со всеми фиксами у которых будут новые имена и куча пустых папок с новыми именами. Зачем нужны эти пустые переименованные папки?
4 Скрипт предназначен для однократного использования? Тогда лучше отказаться от этой идеи совсем. ИМХО.
1 Зачем переименовывать исходные папки? »
Прошу прощения, не совсем точно выразился: разумеется, речь шла не об исходниках папок с хотфиксами, а об их копиях, взятых для поставленной задачи, сами же исходники хранятся в архиве и никаких экспериментов я с ними не провожу. Работа по переименованию папок нужна не потому, что больше нечего делать, а для работы другого скрипта, просто делать это каждый раз для него вручную слишком долго. Но пусть это Вас не беспокоит, даже если будут пустые, но отсортированные и пронумерованные нужным образом папки мне этого достаточно.
Повторно запустить батник уже не получится, ибо имена папок будут иметь уже другой формат.
Для повторной работы ему будет предоставлен новый нормальный неправленный набор папок с хотфиксами. :)Если в дальнейшем будут добавляться папки с новыми фиксами, а устаревшие фиксы со своими папками будут удаляться, то порядковые номера всех папок нужно будет снова править и уже вручную »
Добавляться и удаляться будут, но вручную и не в комплект обработанных батником, а в исходный архив. Батнику, как я уже говорил, будет для обработки предоставляться (из архива) необработанный комплект папок с хотфиксами, от него требуется только их подготовить в соответствии с поставленной задачей.
2 Команды "перенести" в CMD а нет. Либо "скопировать", либо "переместить".»
Моя оплошность, не точно выразился, разумеется имелось в виду "скопировать". :) Но в принципе, пустые обработанные папки для повторной работы батника использоваться не будут, т.к. они - только источнок информации (дата и номер хотфикса) для него.
Скрипт предназначен для однократного использования?»
Нет не для однократного! Я ведь потому и держу отдельный архив с хотфиксами! В архиве у меня находятся папки без сортировки, чтобы без заморочек можно было туда добавлять новые и удалять устаревшие.
Для папок формата:
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!"
)
)
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.
:: Папка в которой будут созданы пустые папки со сквозной нумерацией (не понял зачем они, но пусть будет)
Я думал, что алгоритм работы батника будет построен таким образом, что сначала исходные папки сортируются-переименовываются, согласно исходной задаче, а потом из них копируются сами хотфиксы, переименованные в соответствии с порядковыми номерами отсортированных папок.
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
сначала исходные папки сортируются-переименовываются »
Команды "переименовать" работает с файлами, но не с папками. Значит нужно сначала создать папку с новым именем, затем туда скопировать содержимое "переименовываемой" папки, а потом удалить исходную папку.
gora,
Проверил: пустые папки создались как положено с порядковой нумерацией, но с файлами хотфиксов ничего не происходит, общая выходная папка пуста. :(
общая выходная папка пуста. »
У меня она полна и все нормально. Приведите пути в первых строках Вашего батника:Set InFld=e:\Temp 1\1\1
Set OutFld=e:\Temp 1\1\2
Set allfix=e:\Temp 1\1\2\AllFix
В папках фиксов в %InFld% есть фиксы? По одному в каждой папке? Список имен приведите.
Папка из переменной %allfix% до запуска скрипта создана? Она не создается скриптом...
gora,
Проверил: действительно, пропустил цифру 2 в пути. Исправил - всё работает! Огромнейшее спасибо!
P.S. Есть один вопрос: существует ли возможность сохранить использование скобок или хотя бы знака "-" в названиях папок (в датах)? а то уж очень нечитаемо получается, если нужно что-то конкретное в этих перечнях найти.
Nun-Nun, скобки бывают не только круглые ;). А по формату даты gora совершенно прав — привыкайте использовать формат YYYYMMDD.
скобки бывают не только круглые »
А круглые скобки и не обязательно, можно и квадратные или "<" ">", или вообще без скобок, если дата со знаком "-". :) Что до формата YYYYMMDD, то я не против, просто удобнее читать и искать при YYYY-MM-DD, чем YYYYMMDD.
можно и ... "<" ">" »
Вот этого Вам даже система не позволит сделать! :)просто удобнее читать и искать при YYYY-MM-DD »
Завтра подправлю скрипт для Вашего формата даты (12-07-2009 = DD-MM-YYYY), но круглые скобки убирайте руками.
На будущее, не используйте ни каких спец. символов в именах файлов\папок, если собираетесь их потом обрабатывать скриптами.
@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
:: Формат имен папок с фиксами
:: KB931125_25-10-2010
:: KB2524375_22-03-2011
:: ====================================================================
:: Запись Значение
::
:: Переменная полностью %var% 123456789
:: Первые три символа %var:~0,3% 123
:: Последние три символа %var:~-3% 789
:: Три символа начиная с шестого %var:~5,3% 678
:: Без первых трех символов %var:~3% 456789
:: Без последних трех символов %var:~0,-3% 123456
:: Без первых двух и последних трех %var:~2,-3% 3456
::
:: Замена части переменной (45 на abc) %var:45=abc% 123abc6789
:: Замена части переменной и символов
:: до нее (23, и все что до этого, на xyz) %var:*23=xyz% xyz456789
:: Удаление части переменной (567) %var:567=% 123489
:: ====================================================================
RD /S /Q "%OutFld%"
MD "%allfix%"
For /F "UseBackQ Delims=" %%i In (`Dir "%InFld%" /B /AD /ON 2^>Nul`) Do (
Set ti=%%i
Set dat=!ti:~-10!
Set kb=0!ti:~2,-11!
Set $!dat:~-4!!dat:~3,2!!dat:~0,2!!ti:~0,2!!kb:~-7!=%%i
)
Set cnt=0
For /F "Tokens=1* Delims==" %%i In ('Set $') Do (
Set /A cnt +=1
Set cnt0=00!cnt!
MD "%OutFld%\!cnt0:~-3!_%%j" 2>Nul
For %%f In ("%InFld%\%%j\*.*") Do (
Rem Копирование пронумерованного фикса в общую папку
Copy /Y "%InFld%\%%j\%%~nxf" "%allfix%\!cnt0:~-3!_%%~nxf" >Nul
Rem Копирование пронумерованного фикса в пронумерованную папку. Если НЕ требуется, удалить строку
Copy /Y "%InFld%\%%j\%%~nxf" "%OutFld%\!cnt0:~-3!_%%j\!cnt0:~-3!_%%~nxf" >Nul
Rem Удаление исходной папки вместе с фиксом. Если требуется, раскомментировать строку
Rem RD /S /Q "%InFld%\%%j"
)
)
Огромнейшее спасибо! То, что нужно!
Попробовал батник в работе - вместо желаемого результата получил файл NulRem вот с такм содержанием (явно содержание батника, только покорченное):
OffSetLocal EnableDelayedExpansion:: Папка с исходными папками фиксовSet InFld=C:\Temp\111\Source:: Папка в которой будут созданы пустые папки со сквозной нумерацией (не понял зачем она, но пусть будет)Set OutFld=C:\Temp\111\Target:: Папка в которую копируются переименованные файлы фиксовSet allfix=C:\Temp\111\AllTarget:: Формат имен папок с фиксами:: KB931125_25-10-2010:: KB2524375_22-03-2011:: ====================================================================:: Запись Значение:::: Переменная полностью 123456789:: Первые три символа ~0,3: Последние три символа ~-3: Три символа начиная с шестого ~5,3: Без первых трех символов ~3: Без последних трех символов ~0,-3: Без первых двух и последних трех ~2,-3: :: Замена части переменной (45 на abc) 45=abc: Замена части переменной и символов:: до нее (23, и все что до этого, на xyz) *23=xyz: Удаление части переменной (567) 567=: ====================================================================RD /S /Q ""MD ""For /F "UseBackQ Delims=" %i In (`Dir "" /B /AD /ON 2>Nul`) Do ( Set ti=%i Set dat=!ti:~-10! Set kb=0!ti:~2,-11! Set $!dat:~-4!!dat:~3,2!!dat:~0,2!!ti:~0,2!!kb:~-7!=%i)Set cnt=0For /F "Tokens=1* Delims==" %i In ('Set $') Do ( Set /A cnt +=1 Set cnt0=00!cnt! MD "\!cnt0:~-3!_%j" For %f In ("\%j\*.*") Do (Rem Копирование пронумерованного фикса в общую папку Copy /Y "\%j\%~nxf" "\!cnt0:~-3!_%~nxf" Копирование пронумерованного фикса в пронумерованную папку. Если НЕ требуется, удалить строку Copy /Y "\%j\%~nxf" "\!cnt0:~-3!_%j\!cnt0:~-3!_%~nxf" Удаление исходной папки вместе с фиксом. Если требуется, раскомментировать строкуRem RD /S /Q "\%j" ))Pause
Не пойму, где я снова ухитрился наколбасить? Кроме исправления путей под свои и добавления команды Pause в конце батника больше ничего не трогал. :sorry:
Nun-Nun, прикрепите Ваш файл скрипта к посту. Может быть у Вас в путях спец. символы!?
El Sanchez
19-01-2012, 11:47
Nun-Nun, такое впечатление, что в конце строк нет символов перевода строки, поэтому отрабатывает лишь первая команда Echo.
gora, классная справка по издевательству над переменной. :up
прикрепите Ваш файл скрипта к посту. Может быть у Вас в путях спец. символы!? »
Спецсимволов не использовал. Вот батник:
Nun-Nun
Попробуйте прописать Set allfix=C:\Temp\111\Target\AllTarget У меня эта папка вложенная в %OutFld% и потому строки работают корректно:RD /S /Q "%OutFld%"
MD "%allfix%"
Или замените последние на:RD /S /Q "%OutFld%"
RD /S /Q "%allfix%"
MD "%OutFld%"
MD "%allfix%"
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.