Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] создать и хранить несколько версий файла (http://forum.oszone.net/showthread.php?t=217671)

Oceanel 11-10-2011 11:54 1770752

создать и хранить несколько версий файла
 
Вложений: 1
В общем, я со своим провайдером (не буду называть имя) замучался тем, что когда заканчивается срок периода услуг интернет, то любой открытый адрес в браузере заменяется на страницу что-то типа "Закончился расчетный период, пополните счет на такую-то сумму".
Сам пользуюсь 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 11-10-2011 13:59 1770857

Код:

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 11-10-2011 17:39 1771122

Цитата:

Цитата kiripanda
Цитировать »

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

Код:

for /f "skip=8" %%f in ('dir /b/o-d/tc ') do del /q %%f
Если правильно я понял, dir должна показать файлы и отсортировать по дате создания (начиная со старого)? А for - поудалять?

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

kiripanda 11-10-2011 18:08 1771154

что значит "ни как не отрабатывает" ?
должно остаться 8 самых новых по дате создания копий с именами в формате autosave_YYYYMMDDhhmmss.win
*в папке Opera\profile\sessions

Код:

wmic OS Get LocalDateTime
что выдаёт ?

Iska 11-10-2011 20:08 1771278

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

Oceanel 13-10-2011 13:47 1772447

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 27-09-2012 23:15 1995839

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

' 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\
оба файла и ярлык на первый в автозагрузку
и удобно получаем историю с модификациями вкладок :)


Время: 22:31.

Время: 22:31.
© OSzone.net 2001-