CMD/BAT - [решено] создать и хранить несколько версий файла

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

CMD/BAT - [решено] создать и хранить несколько версий файла

Сообщение Oceanel »

В общем, я со своим провайдером (не буду называть имя) замучался тем, что когда заканчивается срок периода услуг интернет, то любой открытый адрес в браузере заменяется на страницу что-то типа "Закончился расчетный период, пополните счет на такую-то сумму".

Сам пользуюсь Opera с включенной настройкой "Продолжать с места разединения", в работе у меня открыто около 10-50 владок и при запуске все они теряют адреса, точнее меняются на вышеописанный (кнопка назад не активна, я так понимаю что это срабатывает не перенаправление). Угадать и следить за сроком окончания услуги интернет времени нет Изображение

Но есть в Opera файл автосохранения последней сессии перед выходом "%APPDATA%\Opera\Opera\sessions\autosave.win", вот его то я решил и бэкапить. Но не просто перезаписывать последней версией, а создавать две и больше копий.



Задача: создать и хранить несколько последних копий файла.





Вот набросал такой код, может кого заинтересует. Но мне интересно можно ли его упростить?





Код:

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

rem задание расположений папки сессий Opera, хранящей файл autosave.win
set opappdatases=%APPDATA%\Opera\Opera\sessions
rem Счетчик, создающий 8 последних файлов, потом сбрасывается до 0
if not exist "%opappdatases%\*.tmp" ( echo.>"%opappdatases%\%filenautos%.tmp" )
for %%i in ("%opappdatases%\*.tmp") do set filenautos=%%~ni
set filenautosold=%filenautos%
:opcount
if exist "%opappdatases%\%filenautos%.tmp" (
    set /A filenautos+=1
    goto :opcount
  ) else (
    echo.>"%opappdatases%\%filenautos%.tmp"
    del /Q "%opappdatases%\%filenautosold%.tmp"
  )
rem здесь указано максимально возможное имя файла (8)
if exist "%opappdatases%\8.tmp" ren "%opappdatases%\8.tmp" 0.tmp
rem Бэкап файла последней сессии
copy /V /Y "%opappdatases%\autosave.win" "%opappdatases%\autosave(%filenautos%).win">nul&& echo файл autosave(%filenautos%).win скопирован...ОК



Вложение: содержит тот же код, переименовать в *.bat (Кодировка 866)
Аватара пользователя
kiripanda

Re: CMD/BAT - [решено] создать и хранить несколько версий файла

Сообщение kiripanda »

Код:

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

pushd c:\Opera\profile\sessions
for /f "skip=1 delims=." %%d in ('wmic OS Get LocalDateTime') do copy /b autosave.win autosave_%%d.win
for /f "skip=8" %%f in ('dir /b/o-d/tc autosave_??????????????.win') do del /q %%f
popd
Аватара пользователя
Oceanel

Re: CMD/BAT - [решено] создать и хранить несколько версий файла

Сообщение Oceanel »

Цитата kiripanda:



Цитировать
CMD/BAT - [решено] создать и хранить несколько версий файла




Назначение всех строк, кроме третьей, понятно, и в ней ошибка, т.к. она ни как не отрабатывает.





Код:

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

for /f "skip=8" %%f in ('dir /b/o-d/tc ') do del /q %%f

Если правильно я понял, dir должна показать файлы и отсортировать по дате создания (начиная со старого)? А for - поудалять?



Напомню: в папке должно остаться несколько последних версий файла autosave.win (например 8).
Аватара пользователя
kiripanda

Re: CMD/BAT - [решено] создать и хранить несколько версий файла

Сообщение kiripanda »

что значит "ни как не отрабатывает" ?

должно остаться 8 самых новых по дате создания копий с именами в формате autosave_YYYYMMDDhhmmss.win

*в папке Opera\profile\sessions





Код:

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

wmic OS Get LocalDateTime

что выдаёт ?
Аватара пользователя
Iska

Re: CMD/BAT - [решено] создать и хранить несколько версий файла

Сообщение Iska »

kiripanda, он вроде как у всех должен один и тот же формат даты выдавать.
Аватара пользователя
Iska

Re: CMD/BAT - [решено] создать и хранить несколько версий файла

Сообщение Iska »

kiripanda, прошу прощения, не сразу понял что делает та строка Изображение. Я протестил, создав только 4 файла, а нужно было 8 (skip=8).



Выводит список нужных файлов, отсортировав их по дате, новые при этом вверху списка, отступает 8 строк и удаляет все остальное.

при этом остаются в папке все *.win и некоторые (точнее восемь) формата autosave_??????????????.win. Например:



Код:

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

autosave_20111013113333.win
autosave_20111013113322.win
autosave_20111013113041.win
autosave_20111013113037.win
autosave_20111013113033.win
autosave_20111013113023.win
autosave_20111013112941.win
autosave_20111013112339.win
autosave_20111013112135.win - удалится
autosave_20111013112114.win - удалится
autosave_20111013112105.win - удалится

Интересное решение. Спасибо.



Итог в моем батнике (866):



Код:

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

@echo off
title Запуск Opera
mode con cols=40 lines=10
set opappdatases=%APPDATA%\Opera\Opera\sessions
:: проверяем наличие интернет
ping -n 1 ukr.net>nul
if %errorlevel%==0 (goto :startopera)
ping -n 1 google.com.ua>nul
if %errorlevel%==0 (goto :startopera) else (goto :noinet)
echo %errorlevel%
pause
exit
:startopera
:: Проверяем наличие копируемого файла
if not exist "%opappdatases%\autosave.win" ( color 0C& echo Не найден файл autosave.win& pause>nul& exit )
:: Бэкап файла последней сессии
pushd "%opappdatases%"
for /f "skip=1 delims=." %%d in ('wmic OS Get LocalDateTime') do copy /B /V autosave.win autosave_%%d.win
for /f "skip=8" %%f in ('dir /b/o-d/tc autosave_??????????????.win') do del /q %%f
popd
echo бэкап autosave.win создан...ОК
echo.
tasklist|find /I "opera.exe">nul
if %errorlevel%==0 (goto :operastarted)
color 0A
echo Opera будет запущена
ping -n 3 localhost>nul
start "" "C:\Program Files\Opera\opera.exe"
exit
:noinet
color 0C
echo.
echo нету интернета
set $errorinet=%temp%\rar_finish.vbs
echo Set WshShell = WScript.CreateObject("WScript.Shell")>"%$errorinet%"
echo WshShell.Popup "═хЄє шэЄхЁэхЄр, яЁютхЁ№Єх ёюхфшэхэшх.", 60, "┬эшьрэшх!", 16>>"%$errorinet%"
CScript /Logo "%$errorinet%">nul
erase /Q /F "%$errorinet%">nul
exit
:operastarted
cls
color 0D
echo.
echo Opera уже запущена
set $operastarted=%temp%\rar_finish.vbs
echo Set WshShell = WScript.CreateObject("WScript.Shell")>"%$operastarted%"
echo WshShell.Popup "Opera єцх чряє∙хэр!", 60, "┬эшьрэшх!", 64>>"%$operastarted%"
CScript /Logo "%$operastarted%">nul
erase /Q /F "%$operastarted%">nul
exit
Аватара пользователя
Smirnovi

Re: CMD/BAT - [решено] создать и хранить несколько версий файла

Сообщение Smirnovi »

часто слетали вкладки последнее время паэтому наваял вот



Код:

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

' VBScript source code
Set objShell=Createobject("Wscript.Shell")
strFile =  objShell.ExpandEnvironmentStrings("%APPDATA%\Opera\Opera\sessions\autosave.win")
strFileSlash = Replace(strFile, "\", "\\")
intInterval = "2"
strDrive = "C:" 
strFilename = "autosave"
strExtension = "win"
strComputer = "." 
' Connect to WMI
Set objWMIService = GetObject( "winmgmts:" &_ 
    "{impersonationLevel=impersonate}!\\" &_ 
    strComputer & "\root\cimv2" )
' The query string
strQuery =  _
    "Select * From __InstanceOperationEvent" _
    & " Within " & intInterval _
    & " Where Targetinstance Isa 'CIM_DataFile'" _
    & " And TargetInstance.Name='" & strFileSlash & "'"_
'    & " And TargetInstance.Drive='" & strDrive & "'"_
' & " And TargetInstance.Path='" & strFolder & "'" _
'& " And TargetInstance.Filename='" & strFilename & "'" _
'& " And TargetInstance.Extension='" & strExtension & "'" _
' Execute the query
Set colEvents = _
    objWMIService. ExecNotificationQuery (strQuery) 
' The loop
Set objShell = WScript.CreateObject("WScript.Shell")
Do 
    ' Wait for the next event  
    ' Get SWbemEventSource object
    ' Get SWbemObject for the target instance
    Set objEvent = colEvents.NextEvent()
    Set objTargetInst = objEvent.TargetInstance
    ' Check the class name for SWbemEventSource
    ' It cane be one of the following:
    ' - __InstanceCreationEvent
    ' - __INstanceDeletionEvent
    ' - __InstanceModificationEvent
Return = objShell.Run("3.bat", 0, true)
    Select Case objEvent.Path_.Class 
        ' If it is file creation or deletion event
        ' just echo the file name
	Case "__InstanceCreationEvent" 
            WScript.Echo "Created: " & objTargetInst.Name 
        Case "__InstanceDeletionEvent" 
            WScript.Echo "Deleted: " & objTargetInst.Name 
        ' If it is file modification event, 
        ' compare property values of the target and previous
        ' instance and echo the properties that have changed
'        Case "__InstanceModificationEvent" 
'        
'            Set objPrevInst = objEvent.PreviousInstance
'        
'            For Each objProperty In objTargetInst.Properties_
'                If objProperty.Value  _
'                objPrevInst.Properties_(objProperty.Name) Then
'                    WScript.Echo "Changed:        " _
'                        & objTargetInst.Name
'                    WScript.Echo "Property:       " _
'                        & objProperty.Name
'                    WScript.Echo "Previous value: " _
'                        & objPrevInst.Properties_(objProperty.Name)
'                    WScript.Echo "New value:      " _
'                        & objProperty.Value
'                    WScript.Echo
'
'                End If            
 '           Next
    End Select 
Loop



Код:

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

set opappdatases=%APPDATA%\Opera\Opera\sessions
pushd %opappdatases%
if not exist "%opappdatases%\autosave.win" goto :exit
if not exist "%opappdatases%\autosave.win.bak" goto :exit
for /f "skip=1 delims=." %%d in ('wmic OS Get LocalDateTime') do copy /b /V /Y autosave.win autosave_%%d.win
for /f "skip=27" %%f in ('dir /b/o-d/tc autosave_??????????????.win') do del /q %%f
:exit
popd

первое код на VBScript - для детекта изменений - второе собственно сам батник бекапа

скрипт пока сыроват - но может использоватся уже

кидаем в папочку %APPDATA%\Opera\Opera\sessions\

оба файла и ярлык на первый в автозагрузку

и удобно получаем историю с модификациями вкладок Изображение
Ответить

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