Имя: Пароль:
IT
 
Как заставить 7zip убить битый архив при ADD
🠗 (Волшебник 29.06.2022 10:29)
,
0 Гений 1С
 
гуру
28.06.22
08:31
Использую команду архивации:
"C:\Program Files\7-Zip\7z.exe" a -tzip -ssw -y "C:\backup\ut11work\1cv8_%date:~1,1%.zip" "C:\1C\Bases\trade\1cv8.1CD"
Все замечательно, бэкапит на лету.
но есть один нюанс, если выполнение прервется на середине, останется битый (недописанный архив).
Какой ключ можно указать, чтобы убить такой архив? Он блокирует добавление в него.
Только удаление помогает.
но хочется одной командой, чтобы засунуть ее в планировщик.
1 Йохохо
 
28.06.22
08:39
зачем доделывать кривое..
2 2S
 
28.06.22
08:42
(0) чой-то ты сегодня с утра, никакого покоя
3 NorthWind
 
28.06.22
08:43
Одной командой вряд ли получится. Если только t для тестирования, проверить errorlevel и в случае необходимости сделать удаление.
4 NorthWind
 
28.06.22
08:46
Вот тут обсуждение на эту тему
https://sourceforge.net/p/sevenzip/discussion/45798/thread/25bb18fb/
в принципе, предлагается годный вариант - запускать еще один скрипт, который будет проводить тестирование и удаление плохих архивов по всему списку. Соответственно, в следующий раз имя файла будет свободно и архив сделается нормально.
5 vovastar
 
28.06.22
09:02
(2) ПМС же.
6 DJ Anthon
 
28.06.22
09:04
(2) как скрыть темы от гения?
7 DJ Anthon
 
28.06.22
09:05
(4) годный вариант - купить винрар, у него есть такая функция
8 vbus
 
28.06.22
09:10
Все просто
echo Exit Code is %errorlevel%
Exit Codes from 7-Zip
Code    Meaning
0    No error
1    Warning (Non fatal error(s)). For example, one or more files were locked by some other application, so they were not compressed.
2    Fatal error
7    Command line error
8    Not enough memory for operation
255    User stopped the process
9 NorthWind
 
28.06.22
09:22
впрочем, похоже на то, что разбирать еррорлевел оченно тяжело для гениев... :)
10 lodger
 
28.06.22
09:26
(0) купи уже обновлятор, там уже всё есть.
11 NorthWind
 
28.06.22
09:29
(10) так это ж деньги тратить надо. Он их лучше себе возьмет, а хозяину скажет что все настроил... Что, в принципе, верный подход, купить и дурак купит, только деньги при этом пойдут не туда куда надо.
12 ptiz
 
28.06.22
09:47
(0) С чего это прервется?
Надежный способ один:
1) делаем архив
2) пишет файл-флаг завершения
3) отдельным процессом проверяем файл-флаг и убиваем архив, если флага нет
13 Lama12
 
28.06.22
10:25
(0) А может использовать готовое решение наподобие Cobian backup?
14 lodger
 
28.06.22
10:33
(11) он может прокинуть 950 рублей Милькину, и сам взять 1000р за настройку. без шума и пыли.
или взять 2000р себе и сношать нам тут моск.
15 Гений 1С
 
гуру
28.06.22
11:03
(14) я использую обновлятор, но в плане бэкапа его еще не щупал. Не уверен, что там хорошо сделано.
16 Гений 1С
 
гуру
28.06.22
11:11
(7) винрар не умеет на лету копировать вроде как.
17 Aleksey
 
28.06.22
11:12
(13) Cobian backup не советую, у нового автора случился "Путин головного мозга", и кто его знает что он в последних релизах дописал, так что можно получить что он не бекапить, а портит файлы
18 Гений 1С
 
гуру
28.06.22
11:12
(8) все еще проще, я могу убить архив до его обновления. хочется в одной команде.
19 Гений 1С
 
гуру
28.06.22
11:12
(17) да, многие софты счас не проходят проверку на вшивость, та же винда.
20 PLUT
 
28.06.22
13:18
(19) а некоторыми софтами приходится пользоваться с презрением, да?
21 NorthWind
 
28.06.22
13:46
(20) он пользуется софтами, но делает это без уважения :)
22 dangerouscoder
 
28.06.22
14:18
(0) скопируй файл - проверь потом архивируй
23 Гений 1С
 
гуру
28.06.22
15:01
(22) это больше одной строки
24 Garykom
 
гуру
28.06.22
15:18
Геня учи уже Golang https://pkg.go.dev/archive/zip
И напиши свой 7zip, с какими тебе надо параметрами
25 Gary417
 
28.06.22
15:29
(24) вообще надо форкнуть на гитхабе проект и добавить свой ключ, судя по задаче это будет проще и гораздо более правильно
26 Йохохо
 
28.06.22
15:32
(25) проще чем батник в C:\backup\ut11work\
27 Gary417
 
28.06.22
15:34
(26) ну вообще проще, учитывая что он легких  путей не ищет, и для него важно в одну строчку написать (23)
28 Garykom
 
гуру
28.06.22
15:43
Лично я всегда делаю новое имя файла архива из дата-время
Старые же архивы удаляю отдельным заданием если есть более новые
29 Chai Nic
 
28.06.22
15:45
(17) Да он не обновлялся уже лет 5..
30 Гений 1С
 
гуру
28.06.22
15:46
(28) на чем пишешь такие умные скрипты?
31 Garykom
 
гуру
28.06.22
15:53
(30) cmd или sh вполне хватает
32 Злопчинский
 
29.06.22
00:17
(17) а какая версия Кобиана псоледняя нормальна рабочая без проблем с мозгом у автора?
33 vbus
 
29.06.22
07:18
(28)  А копии есть? вопрос сколько иметь копий. Например несколько выходных, база не хорошо изменилась и нормальная резервная копия будет затерта.
34 DJ Anthon
 
29.06.22
09:51
(30) на чем их еще писать?

echo off
Setlocal EnableDelayedExpansion
set base=%1%
if NOT DEFINED base echo Утилита архивирования 4.3 баз данных 1С 7.7 и 8.x
if NOT DEFINED base echo ======================== ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ =================================
if NOT DEFINED base echo Backup Base
if NOT DEFINED base echo Backup Base /F c:\1SBases\Base d:\1SBases\1SUS\Archive b:\Archive
if NOT DEFINED base echo Backup Base /F c:\1SBases\Base d:\1SBases\1SUS\Archive b:\Archive User
if NOT DEFINED base echo Backup Base /F c:\1SBases\Base d:\1SBases\1SUS\Archive b:\Archive User Pass
if NOT DEFINED base echo Backup Base /F \\SERVER\Base \\SERVER\Archive User Pass C:\WinRAR\WinRAR.exe C:\BIN\1cv7s.exe
if NOT DEFINED base echo Backup Base /S SERVER\Base d:\1SBases\Archive
if NOT DEFINED base echo.
if NOT DEFINED base echo ================================ ВНИМАНИЕ ======================================
if NOT DEFINED base echo Для использования автоматического закрытия процессов 1С 8.х в серверном вариантедобавьте в файл c:\ProgramData\1C\1CEStart\1CEStart.cfg путь к файлу общих баз
if NOT DEFINED base echo CommonInfoBases=C:\ProgramData\1C\1CEStart\common.v8i
if NOT DEFINED base echo.
if NOT DEFINED base echo ============================ ИСТОРИЯ ВЕРСИЙ ====================================
if NOT DEFINED base echo 4.3 (17.11.2018): Серверные выгрузки теперь упаковываются в архивы по 100 МБ
if NOT DEFINED base echo ===============================================================================
if NOT DEFINED base pause
if NOT DEFINED base echo 4.2 (12.09.2018): Исправлена проверка настройки реестра при смене пользователя
if NOT DEFINED base echo 4.1 (10.04.2018): Добавлено автоотключение регламентных заданий
if NOT DEFINED base echo 4.0 (03.04.2018): Добавлен дополнительный путь архивации, архивы разбиваются
if NOT DEFINED base echo                   по 100 Мб, добавлены команды для управления скрытыми разделами
if NOT DEFINED base echo 3.6 (11.02.2018): Оставляется цепочка архивов до 9 файлов одного типа (автовыбор                  zip, dt, rar). Увеличен таймаут ожидания 1С Конфигуратора
if NOT DEFINED base echo 3.5 (30.06.2017): Дополнительно удаляются неудавшиеся файлы архивации 1С *.n1
if NOT DEFINED base echo 3.4 (31.08.2016): Исправлен баг с поиском процессов серверных баз 1cv82/1cv8.
if NOT DEFINED base echo 3.3 (13.04.2016): Добавлена поддержка переходных платформ 1С 1cv82/1cv8.
if NOT DEFINED base echo 3.2 (01.04.2016): Добавлена возможность автоматического закрытия соединений                       серверных баз данных 1С
if NOT DEFINED base echo 3.1 (27.03.2016): Добавлена автоматическая архивация WinRAR при неудачной                         выгрузке 1С
if NOT DEFINED base echo 3.0 (24.03.2016): Добавлена возможность автозакрытия файловых баз данных 1С и                     автоматическая регистрация настроек 1С и архивации в реестре
if NOT DEFINED base echo 2.2 (08.03.2016): Добавлена поддержка платформы 1С 8.3
if NOT DEFINED base echo 2.1 (10.03.2016): Добавлена поддержка платформы 1С 8.2
if NOT DEFINED base echo 2.0 (09.06.2014): Добавлено сохранение архива перед созданием нового
if NOT DEFINED base echo 1.1 (      2013): Добавлена архивация WinRAR
if NOT DEFINED base echo 1.0 (      2013): Первый релиз. Архивация баз данных на платформе 1С 7.7
if NOT DEFINED base echo ===============================================================================
if NOT DEFINED base pause
if NOT DEFINED base exit

set mode=%2%
if NOT DEFINED mode echo Не указано, файловая или серверная база, принята как файловая по умолчанию.
if NOT DEFINED mode set mode=/F

set bp=%3%
if NOT DEFINED bp echo Не указан путь к базе! Путь принят по умолчанию (D:\1SBases\%base%)
if NOT DEFINED bp if %mode%==/F (set bp=D:\1SBases\%base%) else set bp=SERVER\%base%

set ap1=%4%
if NOT DEFINED ap1 echo Не указан путь архивации! Путь принят по умолчанию (D:\1SBases\Archive)
if NOT DEFINED ap1 set ap1=D:\1SBases\1SUS\Archive

set str1=%5%
if DEFINED str1 set str2=%str1:\=%
if NOT DEFINED str1 set str1=1
if NOT DEFINED str2 set str2=1
if DEFINED str1 if %str1%==%str2% goto NOAP2

set ap2=%5%
if DEFINED ap2 echo Обнаружен второй путь архивации %ap2%
if DEFINED ap2 echo По второму пути будет выполнена архивация только в виде полного архива WinRAR с одной копией.
set user=%6%
set fuck=%7%
set pathWinRAR=%8%
if NOT DEFINED pathWinRAR set pathWinRAR="C:\Program Files\WinRAR\WinRAR.exe"
set path1c7=%9%
goto endset

:NOAP2
rem echo поехали по 2

if NOT DEFINED ap2 echo Второй путь архивации не указан.
set user=%5%
set fuck=%6%
set pathWinRAR=%7%
if NOT DEFINED pathWinRAR set pathWinRAR="C:\Program Files\WinRAR\WinRAR.exe"
set path1c7=%8%

:endset

if NOT DEFINED path1c7 set path1c7="C:\Program Files (x86)\1Cv77\BIN\1cv7s.exe"
if not exist %path1c7% set path1c7="C:\Program Files\1Cv77\BIN\1cv7s.exe"
set path1c8="c:\Program Files\1cv8\common\1cestart.exe"
if not exist %path1c8% set path1c8="c:\Program Files (x86)\1cv8\common\1cestart.exe"
if not exist %path1c8% set path1c8="c:\Program Files\1cv82\common\1cestart.exe"
if not exist %path1c8% set path1c8="c:\Program Files (x86)\1cv82\common\1cestart.exe"

set longtime=%time:~0,8%
set t=%longtime: =0%
set t=%t::=%

reg QUERY "HKCU\Software\Sysinternals\Handle" /v EulaAccepted >> nul 2>>nul
if NOT ERRORLEVEL 1 goto readyreg
echo Настройка реестра...
reg QUERY "HKCU\Software\1C\1Cv7\7.7\Options\TIPOTHDAYGLB" >> nul 2>>nul
if ERRORLEVEL 1 reg ADD "HKCU\Software\1C\1Cv7\7.7\Options\TIPOTHDAYGLB" /f
reg QUERY "HKCU\Software\1C\1Cv7\7.7\Options\TIPOTHDAYGLB" /v TipOfTheDayGlobal >> nul 2>>nul
if ERRORLEVEL 1 reg ADD "HKCU\Software\1C\1Cv7\7.7\Options\TIPOTHDAYGLB" /v TipOfTheDayGlobal /t REG_SZ /d "0" /f
reg QUERY "HKCU\Software\1C\1Cv7\7.7\Options\TIPOTHDAYGLB\Anthon" >> nul 2>>nul
if ERRORLEVEL 1 reg ADD "HKCU\Software\1C\1Cv7\7.7\Options\TIPOTHDAYGLB\Anthon"
reg QUERY "HKCU\Control Panel\Desktop" >> nul 2>>nul
if ERRORLEVEL 1 reg ADD "HKCU\Control Panel\Desktop" /f
reg QUERY "HKCU\Control Panel\Desktop" /v AutoEndTasks >> nul 2>>nul
if ERRORLEVEL 1 reg ADD "HKCU\Control Panel\Desktop" /v AutoEndTasks /t REG_SZ /d "1" /f
reg QUERY "HKCU\Software\Sysinternals\Handle" >> nul 2>>nul
if ERRORLEVEL 1 reg ADD "HKCU\Software\Sysinternals\Handle" /f
reg QUERY "HKCU\Software\Sysinternals\Handle" /v EulaAccepted >> nul 2>>nul
if ERRORLEVEL 1 reg ADD "HKCU\Software\Sysinternals\Handle" /v EulaAccepted /t REG_DWORD /d 1 /f
reg QUERY "HKU\S-1-5-18\Software\Sysinternals\Handle" >> nul 2>>nul
if ERRORLEVEL 1 reg ADD "HKU\S-1-5-18\Software\Sysinternals\Handle" /f
reg QUERY "HKU\S-1-5-18\Software\Sysinternals\Handle" /v EulaAccepted >> nul 2>>nul
if ERRORLEVEL 1 reg ADD "HKU\S-1-5-18\Software\Sysinternals\Handle" /v EulaAccepted /t REG_DWORD /d 1 /f
:readyreg

set ap1=%ap1%\%base%
if DEFINED ap2 set ap2=%ap2%\%base%
echo Поиск пути архивации %ap1%\...
if not exist %ap1% (md %ap1%)
if not exist %ap1% echo Не удалось найти путь архивации, упаковка прекращена.
if not exist %ap1% ping -n 10 127.0.0.1 > nul
if not exist %ap1% goto end

echo Удаляем старые архивы, кроме последнего...
if exist %ap1%\*.n1 del %ap1%\*.n1

if exist %ap1%\*.zip if exist %ap1%\*.oldz del %ap1%\*.oldz
for /R %ap1%\ %%i in (*.zip) DO (
ren %%~dpi%%~nxi %%~ni.oldz
)

if exist %ap1%\*.dt if exist %ap1%\*.oldt del %ap1%\*.oldt
for /R %ap1%\ %%i in (*.dt) DO (
ren %%~dpi%%~nxi %%~ni.oldt
)

if exist %ap1%\*.rar if exist %ap1%\*.oldr del %ap1%\*.oldr
for /R %ap1%\ %%i in (*.rar) DO (
ren %%~dpi%%~nxi %%~ni.oldr
)

if NOT DEFINED ap2 goto NOOLD
if exist %ap2%\*.n1 del %ap2%\*.n1
if exist %ap2%\*.zip if exist %ap2%\*.old9 del %ap2%\*.old9
if exist %ap2%\*.rar if exist %ap2%\*.old9 del %ap2%\*.old9
if exist %ap2%\*.dt if exist %ap2%\*.old9 del %ap2%\*.old9
if exist %ap2%\*.dt for /R %ap2%\ %%i in (*.old8) DO ren %%~dpi%%~nxi %%~ni.old9
if exist %ap2%\*.dt for /R %ap2%\ %%i in (*.old7) DO ren %%~dpi%%~nxi %%~ni.old8
if exist %ap2%\*.dt for /R %ap2%\ %%i in (*.old6) DO ren %%~dpi%%~nxi %%~ni.old7
if exist %ap2%\*.dt for /R %ap2%\ %%i in (*.old5) DO ren %%~dpi%%~nxi %%~ni.old6
if exist %ap2%\*.dt for /R %ap2%\ %%i in (*.old4) DO ren %%~dpi%%~nxi %%~ni.old5
if exist %ap2%\*.dt for /R %ap2%\ %%i in (*.old3) DO ren %%~dpi%%~nxi %%~ni.old4
if exist %ap2%\*.dt for /R %ap2%\ %%i in (*.old2) DO ren %%~dpi%%~nxi %%~ni.old3
if exist %ap2%\*.dt for /R %ap2%\ %%i in (*.old1) DO ren %%~dpi%%~nxi %%~ni.old2
if exist %ap2%\*.dt for /R %ap2%\ %%i in (*.zip) DO ren %%~dpi%%~nxi %%~ni.old1
if exist %ap2%\*.dt for /R %ap2%\ %%i in (*.rar) DO ren %%~dpi%%~nxi %%~ni.old1
if exist %ap2%\*.dt for /R %ap2%\ %%i in (*.dt) DO ren %%~dpi%%~nxi %%~ni.old1

:NOOLD

echo Анализ %bp%\...
if %mode%==/S echo Обнаружена серверная база 1С 8, попытка выгрузки...
if %mode%==/S goto v8s
if exist %bp%\1Cv8.1CD echo Обнаружена файловая база 1С 8, попытка выгрузки...
if exist %bp%\1Cv8.1CD goto v8f
if exist %bp%\1cv7.md echo Обнаружена файловая база 1С 7.7, попытка выгрузки...
if exist %bp%\1cv7.md goto v77
if exist %pathWinRAR% echo Упаковка каталога с помощью WinRAR...
if exist %pathWinRAR% goto RAR
goto end

:v77
echo [General] > %ap1%\%base%.dat
echo UnloadData=Y >> %ap1%\%base%.dat
echo AutoExchange=N >> %ap1%\%base%.dat
echo Output=%ap1%\(%base%)%DATE%-%t%.txt >> %ap1%\%base%.dat
echo [UnloadData] >> %ap1%\%base%.dat
echo UnloadToFile=%ap1%\(%base%)%DATE%-%t%.zip >> %ap1%\%base%.dat
rem echo Password=123456789 >> %ap1%\%base%.dat

if exist %bp%\MD_CHANGER\md_changer.ini ren %bp%\MD_CHANGER\md_changer.ini md_changer!.ini
if exist %ap1%\%base%.zip del %ap1%\%base%.zip
if exist %ap1%\%base%err.txt del %ap1%\%base%err.txt
echo Выгрузка базы %base% в файл %ap1%\%base%.zip
if not exist %ap1%\Logs md %ap1%\Logs
if exist %ap1%\*.txt move %ap1%\*.txt %ap1%\Logs
if exist %ap1%\*.zip ren %ap1%\*.zip *.old
if exist %ap1%\*.rar ren %ap1%\*.rar *.old
if exist %ap1%\Logs\*.txt xcopy %ap1%\Logs\*.txt %ap1%\Logs\*.old /Y
if exist %ap1%\Logs\*.txt del %ap1%\Logs\*.txt /Q

set lock=1Cv7.lck
echo Проверка на наличие запущенных экземпляров программы 1С 7.7...
if exist %bp%\%lock% del %bp%\%lock% /Q
ping -n 2 127.0.0.1 > nul
if not exist %bp%\%lock% goto ready7
echo Отправка процессам 1С команду на закрытие...
handle %bp%\%lock% > pids.txt
set was=
for /F "tokens=3 skip=5" %%i in (pids.txt) do (
if NOT %%i == !was! taskkill /PID %%i /T
set was=%%i
)
echo Ожидание 90 секунд закрытия процессов 1C...
ping -n 90 127.0.0.1 > nul
if not exist %bp%\%lock% goto ready7
echo Закрытие зависших процессов 1C...
handle %bp%\%lock% > pids.txt
set was=
for /F "tokens=3 skip=5" %%i in (pids.txt) do (
if NOT %%i == !was! taskkill /F /PID %%i /T
set was=%%i
)
if exist %bp%\%lock% del %bp%\%lock%

:ready7
if exist pids.txt del pids.txt

if DEFINED user set user=/N%user%
if DEFINED fuck set fuck=/P%fuck%
if exist %path1c7% (%path1c7% config /m /D%bp% %user% %fuck% /@%ap1%\%base%.dat)
if exist %bp%\MD_CHANGER\md_changer!.ini ren %bp%\MD_CHANGER\md_changer!.ini md_changer.ini
rem if exist %ap1%\*.txt move %ap1%\*.txt %ap1%\Logs

if exist %ap1%\%base%.dat del %ap1%\%base%.dat

if not exist %ap1%\(%base%)%DATE%-%t%.zip echo Не удалось выгрузить базу %base%. Возможно, не закрыты все подключения к ней. Упаковываем каталог с базой целиком....
if not exist %ap1%\(%base%)%DATE%-%t%.zip ping -n 5 127.0.0.1 > nul
if exist %ap1%\(%base%)%DATE%-%t%.zip echo Выгрузка успешно завершена!
if exist %ap1%\(%base%)%DATE%-%t%.zip ping -n 2 127.0.0.1 > nul
if exist %ap1%\(%base%)%DATE%-%t%.zip goto add
goto wrong

:v8s

set cfgpath=c:\ProgramData\1C\1CEStart\1CEStart.cfg
if not exist %cfgpath% (
echo Не найден файл настроек 1С %cfgpath%) & (goto ready8)
TYPE %cfgpath% > 1CEStart.txt

for /F %%i in (1CEStart.txt) do set %%i
del 1CEStart.txt
if NOT DEFINED CommonInfoBases (
echo Не указан путь к файлу общих баз в файле настроек 1С %cfgpath%) & (goto ready8)
if not exist %CommonInfoBases% (
echo Не найден файл общих баз 1С %CommonInfoBases%) & (goto ready8)

TYPE %CommonInfoBases% > common.txt

rem for /F %%i in (common.txt) do set %%i

set foundbase=0
set foundsql=0
for /F %%i in (common.txt) do (
set full=%%i
set cut=!full:%base%=!
if NOT !full! == !cut! set foundbase=1
set cut=!full:Ref=!
if NOT !full! == !cut! set foundsql=1
set cut=!full:ID=!
if NOT !full! == !cut! if !foundbase!==1 if !foundsql!==1 set %%i
if NOT !full! == !cut! set foundbase=0
if NOT !full! == !cut! set foundsql=0
)

del common.txt

if NOT DEFINED ID (
echo Не найдено базы 1С с наименованием %base% в файле %CommonInfoBases%) & (goto ready8)

for /d %%B in (%SystemDrive%\Users\*) do (
set lck="%%B\AppData\Roaming\1C\1Cv82\%ID%\1Cv8.lck"

if exist !lck! del !lck! /Q >> nul 2>>nul
if exist !lck! echo Найден процесс 1С в каталоге %%B, отправка команды закрытия...
if exist !lck! handle !lck! > pids.txt
if exist !lck! for /F "tokens=1,2 skip=5 eol=t delims=:omt" %%i in (pids.txt) do taskkill /PID %%j /T
if exist !lck! del !lck! /Q >> nul 2>>nul
if exist !lck! echo Ожидание закрытия процессов 1C, максимум 10 с...
for /L %%A in (0,1,10) do (
    if exist !lck! del !lck! /Q >> nul 2>>nul
    if exist !lck! ping -n 2 127.0.0.1 > nul
)
if exist !lck! del !lck! /Q >> nul 2>>nul
if exist !lck! echo Принудительное закрытие зависших процессов 1C...
if exist !lck! handle !lck! > pids.txt
if exist !lck! for /F "tokens=1,2 skip=5 eol=t delims=:omt" %%i in (pids.txt) do taskkill /F /PID %%j /T
if exist !lck! echo Ожидание закрытия зависших процессов 1C, максимум 5 с...
for /L %%A in (0,1,5) do (
    if exist !lck! del !lck! /Q >> nul 2>>nul
    if exist !lck! ping -n 2 127.0.0.1 > nul
)
if exist !lck! del !lck! /Q >> nul 2>>nul
if exist !lck! echo Невозможно закрыть процесс, заблокировавший файл !lck!
)

rem Повторение - мать заикания.

for /d %%B in (%SystemDrive%\Users\*) do (
set lck="%%B\AppData\Roaming\1C\1Cv8\%ID%\1Cv8.lck"

if exist !lck! del !lck! /Q >> nul 2>>nul
if exist !lck! echo Найден процесс 1С в каталоге %%B, отправка команды закрытия...
if exist !lck! handle !lck! > pids.txt
if exist !lck! for /F "tokens=1,2 skip=5 eol=t delims=:omt" %%i in (pids.txt) do taskkill /PID %%j /T
if exist !lck! del !lck! /Q >> nul 2>>nul
if exist !lck! echo Ожидание закрытия процессов 1C, максимум 10 с...
for /L %%A in (0,1,10) do (
    if exist !lck! del !lck! /Q >> nul 2>>nul
    if exist !lck! ping -n 2 127.0.0.1 > nul
)
if exist !lck! del !lck! /Q >> nul 2>>nul
if exist !lck! echo Принудительное закрытие зависших процессов 1C...
if exist !lck! handle !lck! > pids.txt
if exist !lck! for /F "tokens=1,2 skip=5 eol=t delims=:omt" %%i in (pids.txt) do taskkill /F /PID %%j /T
if exist !lck! echo Ожидание закрытия зависших процессов 1C, максимум 5 с...
for /L %%A in (0,1,5) do (
    if exist !lck! del !lck! /Q >> nul 2>>nul
    if exist !lck! ping -n 2 127.0.0.1 > nul
)
if exist !lck! del !lck! /Q >> nul 2>>nul
if exist !lck! echo Невозможно закрыть процесс, заблокировавший файл !lck!
)

goto ready8

:v8f

set lock=1Cv8tmp.1CL
if not exist %bp%\%lock% goto ready8
if exist %bp%\%lock% del %bp%\%lock% /Q >> nul 2>>nul
if not exist %bp%\%lock% goto ready8
echo Отправка процессам 1С команду на закрытие...
handle "%bp%\%lock%" > pids.txt
set was=
for /F "tokens=3 skip=5" %%i in (pids.txt) do (
if NOT %%i == !was! taskkill /PID %%i /T
set was=%%i
)
if exist %bp%\%lock% echo Ожидание закрытия процессов 1C, максимум 10 с...
for /L %%A in (0,1,10) do (
    if exist %bp%\%lock% del %bp%\%lock% /Q >> nul 2>>nul
    if exist %bp%\%lock% ping -n 2 127.0.0.1 > nul
)

if not exist %bp%\%lock% goto ready8

echo Закрытие зависших процессов 1C...
handle "%bp%\%lock%" > pids.txt
set was=
for /F "tokens=3 skip=5" %%i in (pids.txt) do (
if NOT %%i == !was! taskkill /F /PID %%i /T
set was=%%i
)

if exist %bp%\%lock% echo Ожидание закрытия зависших процессов 1C, максимум 5 с...
for /L %%A in (0,1,5) do (
    if exist %bp%\%lock% del %bp%\%lock% /Q >> nul 2>>nul
    if exist %bp%\%lock% ping -n 2 127.0.0.1 > nul
)

:ready8

if exist pids.txt del pids.txt /Q

if not exist %ap1%\Logs md %ap1%\Logs
if exist %ap1%\Logs\*.txt ren %ap1%\Logs\*.txt *.old
if exist %ap1%\*.txt move %ap1%\*.txt %ap1%\Logs
if exist %ap1%\*.dt ren %ap1%\*.dt *.oldt
if exist %ap1%\*.rar ren %ap1%\*.rar *.oldr

if DEFINED ap2 if not exist %ap2%\Logs md %ap2%\Logs
if DEFINED ap2 if exist %ap2%\Logs\*.txt ren %ap2%\Logs\*.txt *.old
if DEFINED ap2 if exist %ap2%\*.txt move %ap2%\*.txt %ap2%\Logs

echo    Ожидание 30 секунд конфигуратора 1С для запуска выгрузки базы
echo    %bp% в файл
echo    %ap1%\(%base%)%DATE%-%t%.dt...
if DEFINED user set user=/N"%user%"
if DEFINED fuck set fuck=/P%fuck%
%path1c8% CONFIG %mode% %bp% %user% %fuck% /DumpIB"%ap1%\(%base%)%DATE%-%t%.dt" /AllowExecuteScheduledJobs -off
if exist %ap1%\*.txt move %ap1%\*.txt %ap1%\Logs
ping -n 25 127.0.0.1 > nul

:wait
ping -n 5 127.0.0.1 > nul
if exist %ap1%\(%base%)%DATE%-%t%.dt goto last
if exist %ap1%\(%base%)%DATE%-%t%.n1 echo Выгрузка в процессе (n1)...
if exist %ap1%\(%base%)%DATE%-%t%.n1 goto wait

:last

if not exist %ap1%\(%base%)%DATE%-%t%.dt if not exist %ap1%\(%base%)%DATE%-%t%.n1 goto wrong
ren %ap1%\(%base%)%DATE%-%t%.dt (%base%)%DATE%-%t%.dt1 >> nul 2>>nul
if not exist %ap1%\(%base%)%DATE%-%t%.dt1 echo Выгрузка в процессе (dt)...
if not exist %ap1%\(%base%)%DATE%-%t%.dt1 goto wait
ren %ap1%\(%base%)%DATE%-%t%.dt1 (%base%)%DATE%-%t%.dt >> nul 2>>nul

echo Копирование данных на вторичный путь архивации...
if DEFINED ap2 if exist %ap2%\*.zip del %ap2%\*.zip
if DEFINED ap2 if exist %ap2%\*.dt del %ap2%\*.dt
if DEFINED ap2 if exist %ap1%\*.zip copy %ap1%\*.zip %ap2%
if DEFINED ap2 if exist %ap1%\*.dt copy %ap1%\*.dt %ap2%

if %mode%==/F goto add

if not exist %ap1%\Logs md %ap1%\Logs
if exist %ap1%\*.rar del %ap1%\*.rar /Q
%pathWinRAR% a -y -dh -ibck -ilog%ap1%\(%base%)%DATE%-%t%.txt -r %ap1%\(%base%)%DATE%-%t%.rar -m1 -v100M %ap1%\*.dt -x1Cv7.LCK
if DEFINED ap2 if not exist %ap2%\Logs md %ap2%\Logs
if DEFINED ap2 if exist %ap2%\*.rar del %ap2%\*.rar /Q
if DEFINED ap2 %pathWinRAR% a -y -dh -ibck -ilog%ap2%\(%base%)%DATE%-%t%.txt -r %ap2%\(%base%)%DATE%-%t%.rar -m1 %ap1%\*.dt -x1Cv7.LCK

goto end

:wrong
if exist %bp% echo Не удалось запустить выгрузку Конфигуратора 1С. Аварийная архивация с помощью WinRAR...
if exist %bp% goto RAR
if not exist %bp% goto end

:add
if exist %bp% echo Дополнительная архивация с помощью WinRAR...
if exist %bp% goto RAR
if not exist %bp% goto end

:RAR
if not exist %ap1%\Logs md %ap1%\Logs
if exist %ap1%\*.rar del %ap1%\*.rar /Q
%pathWinRAR% a -y -dh -ibck -ilog%ap1%\(%base%)%DATE%-%t%.txt -r %ap1%\(%base%)%DATE%-%t%.rar -m1 -v100M %bp% -x1Cv7.LCK
if DEFINED ap2 if not exist %ap2%\Logs md %ap2%\Logs
if DEFINED ap2 if exist %ap2%\*.rar del %ap2%\*.rar /Q
if DEFINED ap2 %pathWinRAR% a -y -dh -ibck -ilog%ap2%\(%base%)%DATE%-%t%.txt -r %ap2%\(%base%)%DATE%-%t%.rar -m1 %bp% -x1Cv7.LCK

:end
echo Архивация завершена.
ping -n 5 127.0.0.1 > nul
35 DJ Anthon
 
29.06.22
09:52
сорян, что не под спойлер
36 arsik
 
гуру
29.06.22
09:54
(34) Это какой то пиздец.
В одну строчку ну никак не влезет :) И как потом с этой ебалой разбираться если логику нужно будет поменять?
Повершелл наше все.
37 NorthWind
 
29.06.22
09:59
(34) очень круто, но нифига не понятно. Я как-то больше для подобных вещей люблю VBS. Можно Python еще или PS.
38 vbus
 
29.06.22
10:10
(37) Что не понятно?,
if DEFINED fuck set fuck=/P%fuck%
все понятно
39 DJ Anthon
 
29.06.22
10:12
(37) большая часть кода позаимствована у Abrahams.
да, понять сложно ))
1. определяется тип базы и версия 1С
2. проверяется, открыта база или нет.
3. если открыта, то посылаются сигналы на закрытие и ожидание
4. если не дождались - убиваются.
5. выгрузка в dt с автоматической чисткой самого старого архива, хранится 10 копий
6. архивация в рар на два адреса (можно и один) с автоматической чисткой самого старого архива, хранится 10 копий

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

вызывается это все другим батником типа


echo off
e:
cd e:\1SBases\1SUS\Archive

echo Подключение диска A:...
mountvol A:\  \\?\Volume{642880c2-34e2-11e6-b7be-806e6f6e6963}\
ping -n 2 127.0.0.1 > nul
cls

call Backup.bat Accounting /F c:\1SBases\Accounting e:\1SBases\1SUS\Archive a:\Archive Архивация пароль
call Backup.bat HRM /F c:\1SBases\HRM e:\1SBases\1SUS\Archive a:\Archive Архивация пароль
call Backup.bat Общий /F e:\Общий a:\Archive
shutdown -s -t 36000
cls
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс