Войти

Показать полную графическую версию : Как автоматически обновить содержимое архивов?


Medvedoc
23-07-2021, 09:58
Добрый день! Как автоматически обновить на основании содержимого текстового документа содержимое файла архивов?

В папке имеются множественные архивы формата 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


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

И соответственно обратный эффект при наличии другого файла - удалять строки в архивах если есть в текстовом файле.

Iska
23-07-2021, 18:47
Вы уж определитесь:
https://i.imgur.com/MQxySIQ.png

Medvedoc
23-07-2021, 20:22
Iska, правильно в структуре указано

megaloman
23-07-2021, 22:48
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
24-07-2021, 08:50
megaloman, отлично работает. Единственное только проблемы с кириллицей, но заменив название файла на латиницу все прекрасно сработало.

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

megaloman
24-07-2021, 08:57
Medvedoc, чтобы не было проблем с кириллицей, сохраняйте батник в 866 кодировке.
Либо после cls вставьте
>nul chcp 1251
берется название из текстового файла пробегается по архивам и если такое есть просто удаляет его »
Что есть в текстовом файле и что удаляется: строка в заархивированном файле или целиком архив.

megaloman
24-07-2021, 12:56
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
24-07-2021, 19:26
Да, все отлично работает =) спасибо большое

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

megaloman
24-07-2021, 19:38
А то когда папок больше 100 »
Папок или архивов? Если архивов, то добавить одну строку с Echo после If If Exist "%%~ni.%Ext%" (
Echo %Time% "%%~ni.%Ext%"
Чтобы архиватор не мешал наблюдать процесс добавил ключ -ibck




© OSzone.net 2001-2012