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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удалить переносы строк

Ответить
Настройки темы
CMD/BAT - [решено] Удалить переносы строк

Старожил


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

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


Сам не смог осилить проблему встроенными средствами командного интерпретатора, прошу помощи у сообщества. Дано: директория с файлами и поддиректориями разного уровня вложенности. Нужно построить валидный xml-файл, содержащий в себе данные о каждой директории и файле (те файлы, что находятся прямо в корне, не самих поддиректориях - игнорируем), причем представляя относительные пути к ним от корня, и заменяя win-слэши (обратные) в пути, на unix-слэши, а так же получая md5-хэш файла и его размер в байтах. Практически всё это реализовал с помощью вот такого скрипта:
Код: Выделить весь код
@Echo Off
SetLocal EnableDelayedExpansion
Set Path=%Path%;%CD%\bin

:: Имя генерируемого файла
Set OutFile=MinecraftResources.xml
:: Тут обязательно полный путь, нужно для костыля с отсечением лишнего из пути
Set DataRoot=D:\Projects\Olanet\OMSS\master\webdata\MinecraftResources


:: Пишем заголовок
:MakeHeader
>"%OutFile%" (
	Echo ^<?xml version="1.0" encoding="UTF-8"?^>
	Echo ^<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"^>
	Echo ^<Name^>MinecraftResources^</Name^>
	Echo ^<Prefix/^>
	Echo ^<Marker/^>
	Echo ^<MaxKeys^>1000^</MaxKeys^>
	Echo ^<IsTruncated^>false^</IsTruncated^>
)

:: Пишем содержимое contents, файлы и директории
:: Здесь важен порядок следования, директория - её содержимое, что
:: достигается вложенным циклом
:WriteData
:: Получение вложенных поддиректорий
For /F "delims=" %%D In ('Dir "%DataRoot%\" /S /B /AD') Do (
	Set Dir=%%D
:: Жуткий костыль с получением относительного пути от корня
	Set Dir=!Dir:%DataRoot%\=!
	Set XmlDir=!Dir:\=/!/
:: md5 - фиксированный, размер - 0
	Call :GetTimestamp
	Echo ^<Contents^>>>"%OutFile%"
	Echo ^<Key^>!XmlDir!^</Key^>>>"%OutFile%"
	Echo ^<LastModified^>!Timestamp!^</LastModified^>>>"%OutFile%"
	Echo ^<ETag^>00000000000000000000000000000000^</ETag^>>>"%OutFile%"
	Echo ^<Size^>0^</Size^>>>"%OutFile%"
	Echo ^<StorageClass^>STANDARD^</StorageClass^>>>"%OutFile%"
	Echo ^</Contents^>>>"%OutFile%"
:: Получение содержимого поддиректорий
	For /F "delims=" %%F In ('Dir "%DataRoot%\!Dir!\" /B /A-D 2^>nul') Do (
		Set XmlFileFullpath="%DataRoot%\!Dir!\%%~nxF"
		Call :GetSize !XmlFileFullpath!
		Call :GetMD5 !XmlFileFullpath!
		Call :GetTimestamp
		Echo ^<Contents^>>>"%OutFile%"
		Echo ^<Key^>!XmlDir!%%~nxF^</Key^>>>"%OutFile%"
		Echo ^<LastModified^>!Timestamp!^</LastModified^>>>"%OutFile%"
		Echo ^<ETag^>!MD5!^</ETag^>>>"%OutFile%"
		Echo ^<Size^>!Size!^</Size^>>>"%OutFile%"
		Echo ^<StorageClass^>STANDARD^</StorageClass^>>>"%OutFile%"
		Echo ^</Contents^>>>"%OutFile%"
	)
)

:: Пишем конец файла
:MakeFooter
Echo ^</ListBucketResult^>>>"%OutFile%"
Exit



:: Дата-время. Рассчитано на формат даты dd.mm.yyyy, у времени
:: ведущий пробел заменяется на ведущий ноль, если есть
:GetTimestamp
For /F "tokens=1,2,3 delims=." %%A In ("%Date%") Do (Set FormattedDate=%%C-%%B-%%A)
Set FormattedTime=%Time:,=.%
Set Timestamp=%FormattedDate%T%FormattedTime: =0%0Z
Exit /B

:: Размер в байтах
:GetSize
Set Size=%~z1
Exit /B

:: Получение хэша, пришлось использовать внешнюю утилиту с очень
:: нелогичным форматом вывода
:GetMD5
For /F "tokens=1 delims=\/ " %%H In ('md5hash %1') Do (Set MD5=%%H)
Exit /B
На выходе получаю вполне валидный xml, пример начала файла:
Код: Выделить весь код
<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>MinecraftResources</Name>
<Prefix/>
<Marker/>
<MaxKeys>1000</MaxKeys>
<IsTruncated>false</IsTruncated>
<Contents>
<Key>music/</Key>
<LastModified>2012-06-22T03:07:58.870Z</LastModified>
<ETag>00000000000000000000000000000000</ETag>
<Size>0</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>
<Contents>
<Key>music/calm1.ogg</Key>
<LastModified>2012-06-22T03:07:59.000Z</LastModified>
<ETag>3c5b792652b43e9876b7e7b19c0b376b</ETag>
<Size>2530812</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>
<Contents>
<Key>music/calm2.ogg</Key>
<LastModified>2012-06-22T03:07:59.090Z</LastModified>
<ETag>056778e3465b292531ecd952a0cb555d</ETag>
<Size>1976731</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>
<Contents>
<Key>music/calm3.ogg</Key>
<LastModified>2012-06-22T03:07:59.170Z</LastModified>
<ETag>ff32c2bfea9a23555713ca1d0739ee06</ETag>
<Size>2232651</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>
Но для корректной работы использующей этот файл программы нужно все тэги, начиная со второй строки, вытянуть в одну линию, чтобы получить вот такой результат:
Код: Выделить весь код
<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Name>MinecraftResources</Name><Prefix/><Marker/><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><Key>music/</Key><LastModified>2012-06-22T03:07:58.870Z</LastModified><ETag>00000000000000000000000000000000</ETag><Size>0</Size><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>music/calm1.ogg</Key><LastModified>2012-06-22T03:07:59.000Z</LastModified><ETag>3c5b792652b43e9876b7e7b19c0b376b</ETag><Size>2530812</Size><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>music/calm2.ogg</Key><LastModified>2012-06-22T03:07:59.090Z</LastModified><ETag>056778e3465b292531ecd952a0cb555d</ETag><Size>1976731</Size><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>music/calm3.ogg</Key><LastModified>2012-06-22T03:07:59.170Z</LastModified><ETag>ff32c2bfea9a23555713ca1d0739ee06</ETag><Size>2232651</Size><StorageClass>STANDARD</StorageClass></Contents>
Задача, стоящая передо мной - сделать вывод скрипта идентичным вышеописанному, все данные (кроме самой первой строки) вытянуть в одну строку. Сразу генерировать однострочный xml посредством cmd мне не представляется возможным - echo вставляет перевод строки, и от этого никуда не денешься. Вытягивать все данные в одну строку, обрабатывая уже сгенерированный xml - у cmd есть ограничение на размер переменной, этот способ увы, не подходит. Я рассматривал вариант с sed, там это делается элементарно, одной командой, но хотелось бы конечно обойтись без сторонних утилит.

Отправлено: 04:20, 22-06-2012

 

Ветеран


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

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


Цитата Anonymоus:
echo вставляет перевод строки, и от этого никуда не денешься. »
<nul set /p sVar=Text пробовали?

WSH/PoSH не думали опробовать (поддержка работы с XML есть, MD5 считается)?
Это сообщение посчитали полезным следующие участники:

Отправлено: 04:48, 22-06-2012 | #2



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

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


Старожил


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

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


Iska, благодарю, вы меня выручили. Всё идеально работает.
Насчет PoSH подумывал, но как-то всё время откладываю ознакомление с ним.

Отправлено: 05:27, 22-06-2012 | #3



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удалить переносы строк

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Поиск слова в тексте, удаление строки, удаление 8 строк выше и 3 строк ниже Alk-13 Скриптовые языки администрирования Windows 0 10-02-2012 18:06
CMD/BAT - Удалить несколько строк из файла GhostKU Скриптовые языки администрирования Windows 1 01-09-2011 18:40
[решено] Как вручную удалить вирус который не могут удалить антивирусы. LiSS71 Лечение систем от вредоносных программ 3 20-08-2011 23:32
Разное - [решено] Как удалить ярлык с рабоч. стола, если в контекстном меню нет пункта Удалить Denkxx Microsoft Windows 7 5 25-09-2009 14:56
Сравнение строк в PHP Dutchman Mihel Вебмастеру 8 06-07-2004 13:04




 
Переход