CMD/BAT - Как автоматически обновить содержимое архивов?

Ответить
Аватара пользователя
Medvedoc

CMD/BAT - Как автоматически обновить содержимое архивов?

Сообщение Medvedoc »

Добрый день! Как автоматически обновить на основании содержимого текстового документа содержимое файла архивов?



В папке имеются множественные архивы формата zip с текстовыми документами в формате txt.



То есть структура такая:





Код:

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

папка
- архив aaa.txt.zip
- - текстовый файл aaa.txt
- архив bbb.txt.zip
- - текстовый файл bbb.txt
- архив ccc.txt.zip
- - текстовый файл ccc.txt
- и так далее



Код:

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

Содержимое архива
- текстовый файл.txt  (например, aaa.txt или bbb.txt)

И есть просто текстовый документ, на основании которого необходимо обновить информацию в архивах

файл обновления



Код:

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

текстовый файл
- text.aaa
- text2.aaa
- text3.aaa
- text4.bbb
- text5.bbb
- text6.ccc
- text7.ccc
- и так далее

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

Схематически:в текстовом файле имеется строка text.aaaполучаем правую часть текста после точки aaaнаходим архив с одноименным названием ааа.txt.zipдобавляем в содержащийся в нем текстовый файл aaa.txt полностью строку text.aaa

Прикрепил схематический пример как было и как должно получиться



И соответственно обратный эффект при наличии другого файла - удалять строки в архивах если есть в текстовом файле.
Вложения
Пример.zip
(3.83 КБ) 0 скачиваний
Пример.zip
(3.83 КБ) 0 скачиваний
Аватара пользователя
Iska

Re: CMD/BAT - Как автоматически обновить содержимое архивов?

Сообщение Iska »

Вы уж определитесь:

Скрытый текст

[spoiler]Изображение[/spoiler]
Аватара пользователя
Medvedoc

Re: CMD/BAT - Как автоматически обновить содержимое архивов?

Сообщение Medvedoc »

Medvedoc,

Код:

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

@Echo Off
cls
	Set "BoxIn=Z:\Box_In\Пример"
	Set "Ext=zip"
	Set "Ext=txt.zip"
	Set "FileTxt=Z:\Box_In\Пример\Текстовый файл.txt"
	Set Arc="C:\Program Files\WinRAR\WinRAR.exe"
	If Not Exist "%FileTxt%" Echo File "%FileTxt%" not found &Pause &Exit /B
	Set "DirTmp=%BoxIn%\%~nx0.tmp"
	2>nul Rd /S /Q "%DirTmp%"
	Md "%DirTmp%"
	Pushd %BoxIn% &&(
		FOR /F "usebackq delims=" %%s IN ("%FileTxt%") DO (
			Echo %%s>>"%DirTmp%\%%~xs.txt"
		)
		For /F "usebackq tokens=* delims=." %%i In (`2^>nul Dir "%DirTmp%\.*.txt" /B /A:-D`) Do (
			If Exist "%%~ni.%Ext%" (
				%Arc% e -y -ibck "%%~ni.%Ext%" "%%i"
				If Exist "%%i" (
					>nul Copy /B "%%i"+"%DirTmp%\.%%i" "%%i"
					%Arc% a -y -ep -df -ibck "%%~ni.%Ext%" "%%i"
				)
			)
		)
		Popd
	)
	2>nul Rd /S /Q "%DirTmp%"
	FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "ToDay=%%d"
	>nul Move "%FileTxt%" "%FileTxt%.%ToDay%"
Pause
Exit /B

Так как постановка путанная, сейчас работает формат имени aaa.txt.zip, если надо aaa.zip строку

Set "Ext=txt.zip"

удалите
Аватара пользователя
Medvedoc

Re: CMD/BAT - Как автоматически обновить содержимое архивов?

Сообщение Medvedoc »

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



А как сделать теперь наоборот? Поиск по папкам и удаление если имеется? То есть берется название из текстового файла пробегается по архивам и если такое есть просто удаляет его.
Аватара пользователя
megaloman

Re: CMD/BAT - Как автоматически обновить содержимое архивов?

Сообщение megaloman »

Medvedoc, чтобы не было проблем с кириллицей, сохраняйте батник в 866 кодировке.

Либо после cls вставьте

>nul chcp 1251


Цитата Medvedoc:



берется название из текстового файла пробегается по архивам и если такое есть просто удаляет его
CMD/BAT - Как автоматически обновить содержимое архивов?




Что есть в текстовом файле и что удаляется: строка в заархивированном файле или целиком архив.
Аватара пользователя
megaloman

Re: CMD/BAT - Как автоматически обновить содержимое архивов?

Сообщение megaloman »

Medvedoc, Если удалить в заархивированном файле строки, указанные в текстовом, то:

Код:

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

@Echo Off
cls
	Set "BoxIn=Z:\Box_In\Пример"
	Set "Ext=zip"
	Set "Ext=txt.zip"
	Set "FileTxt=Z:\Box_In\Пример\Текстовый файл.txt"
	Set Arc="C:\Program Files\WinRAR\WinRAR.exe"
	If Not Exist "%FileTxt%" Echo File "%FileTxt%" not found &Pause &Exit /B
	Set "DirTmp=%BoxIn%\%~nx0.tmp"
	2>nul Rd /S /Q "%DirTmp%"
	Md "%DirTmp%"
	Pushd %BoxIn% &&(
		FOR /F "usebackq delims=" %%s IN ("%FileTxt%") DO (
			Echo %%s>>"%DirTmp%\%%~xs.txt"
		)
		For /F "usebackq tokens=* delims=." %%i In (`2^>nul Dir "%DirTmp%\.*.txt" /B /A:-D`) Do (
			If Exist "%%~ni.%Ext%" (
				%Arc% e -y -ibck "%%~ni.%Ext%" "%%i"
				If Exist "%%i" (
					>".%%i" FindStr /B /L /I /V /G:"%DirTmp%\.%%i" "%%i"
					>nul Move /Y ".%%i" "%%i"
					%Arc% a -y -ep -df -ibck "%%~ni.%Ext%" "%%i"
				)
			)
		)
		Popd
	)
	2>nul Rd /S /Q "%DirTmp%"
	FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "ToDay=%%d"
	>nul Move "%FileTxt%" "%FileTxt%.%ToDay%"
Pause
Exit /B
Аватара пользователя
Medvedoc

Re: CMD/BAT - Как автоматически обновить содержимое архивов?

Сообщение Medvedoc »

Да, все отлично работает Изображение спасибо большое



А что нужно добавить, чтобы в командной строке видеть процесс выполнения? А то когда папок больше 100 не понятно идет процесс или нет
Аватара пользователя
Medvedoc

Re: CMD/BAT - Как автоматически обновить содержимое архивов?

Сообщение Medvedoc »

Цитата Medvedoc:



А то когда папок больше 100
CMD/BAT - Как автоматически обновить содержимое архивов?




Папок или архивов? Если архивов, то добавить одну строку с Echo после If

Код:

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

			If Exist "%%~ni.%Ext%" (
				Echo %Time%	"%%~ni.%Ext%"  

Чтобы архиватор не мешал наблюдать процесс добавил ключ -ibck
Ответить

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