Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] создать и хранить несколько версий файла

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

Аватара для Oceanel

Новый участник


Сообщения: 9
Благодарности: 3

Профиль | Отправить PM | Цитировать


Изменения
Автор: Oceanel
Дата: 11-10-2011
Вложения
Тип файла: txt operastart.txt
(1.3 Kb, 3 просмотров)
В общем, я со своим провайдером (не буду называть имя) замучался тем, что когда заканчивается срок периода услуг интернет, то любой открытый адрес в браузере заменяется на страницу что-то типа "Закончился расчетный период, пополните счет на такую-то сумму".
Сам пользуюсь 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)

Отправлено: 11:54, 11-10-2011

 

Старожил


Сообщения: 352
Благодарности: 119

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
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
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:59, 11-10-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Oceanel

Новый участник


Сообщения: 9
Благодарности: 3

Профиль | Отправить PM | Цитировать


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

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

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

Отправлено: 17:39, 11-10-2011 | #3


Старожил


Сообщения: 352
Благодарности: 119

Профиль | Отправить PM | Цитировать


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

Код: Выделить весь код
wmic OS Get LocalDateTime
что выдаёт ?

Отправлено: 18:08, 11-10-2011 | #4


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Отправлено: 20:08, 11-10-2011 | #5


Аватара для Oceanel

Новый участник


Сообщения: 9
Благодарности: 3

Профиль | Отправить PM | Цитировать


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

Отправлено: 13:47, 13-10-2011 | #6


Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 23:15, 27-09-2012 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] создать и хранить несколько версий файла

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Копирование файла на несколько IP Moksar Скриптовые языки администрирования Windows 4 14-02-2018 20:35
Копирование файла на несколько IP Moksar AutoIt 2 12-06-2011 16:40
[решено] Как создать несколько Tab в одном окне? proxy AutoIt 2 06-04-2009 21:48
>100m/LongLink - Помогите создать беспроводную сеть на несколько км Illusionist Сетевое оборудование 2 26-06-2008 21:39
Mandriva/Mandrake - Как создать несколько интернет подключений в Mandrive macless Общий по Linux 8 06-11-2007 17:32




 
Переход