 |
|
Как автоматически обновить содержимое архивов?
Вложений: 1
Добрый день! Как автоматически обновить на основании содержимого текстового документа содержимое файла архивов?
В папке имеются множественные архивы формата 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, правильно в структуре указано
|
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"
удалите
|
megaloman, отлично работает. Единственное только проблемы с кириллицей, но заменив название файла на латиницу все прекрасно сработало.
А как сделать теперь наоборот? Поиск по папкам и удаление если имеется? То есть берется название из текстового файла пробегается по архивам и если такое есть просто удаляет его.
|
Medvedoc, чтобы не было проблем с кириллицей, сохраняйте батник в 866 кодировке.
Либо после cls вставьте
>nul chcp 1251
Цитата:
Цитата 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" (
>".%%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
|
Да, все отлично работает =) спасибо большое
А что нужно добавить, чтобы в командной строке видеть процесс выполнения? А то когда папок больше 100 не понятно идет процесс или нет
|
Цитата:
Цитата Medvedoc
А то когда папок больше 100 »
|
Папок или архивов? Если архивов, то добавить одну строку с Echo после If
Код:
If Exist "%%~ni.%Ext%" (
Echo %Time% "%%~ni.%Ext%"
Чтобы архиватор не мешал наблюдать процесс добавил ключ -ibck
|
Время: 17:18.
© OSzone.net 2001-