Что нового

[Автоматизация] Скрипт по созданию скриншота, нужно допилить

Timerlan

Новичок
Сообщения
93
Репутация
0
Уважаемые гуру! Помогите доделать скрипт. Есть скрипт по созданию скриншота.
Код:
#NoTrayIcon
#include <ScreenCapture.au3>
#include <File.au3>
Global $iTimeOut = 60000;таймаут в мсек

HotKeySet('{Esc}', '_Exit')
;_MyScreen()
;AdlibRegister('_MyScreen', $iTimeOut)
Run ('c:\program files\Mozilla Firefox\firefox.exe')
Sleep(20*1000)
Send('{F11}')
Sleep(20*1000)
Global $s_Dir = @ScriptDir & '\Screen\'
While 1
    If @HOUR = '12'And @MIN = '00' And @SEC = '00' Then _MyScreen()
    If @MDAY = '20' And @HOUR = '13' And @MIN = '00' And @SEC = '00' Then
    $array = _FileListToArray($s_Dir,'*.png',1)
    For $i = 1 To UBound($array) -1
        FileDelete($array[$i])
    Next
    EndIf
    Sleep(100)
WEnd

Func _MyScreen()
    Local $s_FileName, $f_Cursor = False, $s_date = StringFormat('%s.%s.%s.%s', @MDAY, @MON, @YEAR)
    If Not FileExists($s_Dir) Then DirCreate($s_Dir)
    $s_FileName = StringFormat('%s.%s.%s.%s %s.%s.%s.jpg', @ComputerName, @MDAY, @MON, @YEAR, @HOUR, @MIN, @SEC)
    _ScreenCapture_Capture($s_Dir & $s_FileName, 0, 0, @DesktopWidth, @DesktopHeight, $f_Cursor)
    $array_shar = _FileListToArray('C:\screen\' & $s_date, '*.jpg', 1)
    For $i = 1 To UBound($array_shar) - 1
      If StringInStr($array_shar[$i], 'NoScreen') Then
    FileDelete('C:\screen\' & $s_date & '\' & $array_shar[$i])
    FileCopy($s_Dir & '\' & $s_FileName, 'C:\screen\' & $s_date & '\' & $s_FileName)
    ExitLoop
EndIf
    Next
EndFunc


Суть скрипта такая создает пустую каритинку на сервере, с названием noscreen, далее делает скриншот в определенное время на локальной машине, и дальше ищет на сервере файл с названием Noscreen, если этот файл есть то заменяет его скриншотом и это делает один раз только тогда когда создается скриншот. Вот мне нужно как то сделать так, чтоб он искал этот файл Noscreen до тех пор пока он его не найдет, и этот скриншот делается один раз в сутки, т.е получается что он должен искать скажем так до 0:00 часов, ну или как это объяснить получается то что каждый день когда создается скриншот он должен искать именно под этот скриншот Noscreen.
Как я понял вот эту функцию как то нужно загнать в цикл
Код:
If StringInStr($array_shar[$i], 'NoScreen') Then
    FileDelete('C:\screen\' & $s_date & '\' & $array_shar[$i])
    FileCopy($s_Dir & '\' & $s_FileName, 'C:\screen\' & $s_date & '\' & $s_FileName)
    ExitLoop
EndIf

Может конечно я путаю помогите плиз мне разобраться. Просто проблема в чем, в том что некоторые скриншот не доходят до сервера. Просто бывают перебои в сети из этого нужно чтоб он отправлял до тех пор пока не появятся они на сервере.
И еще у меня там есть моменнт когда запускается Мозила нажимается F11 чтоб развернуть его на весь экран. мне нужно чтоб он переодически скажем так раз в час нажимал F5 чтоб обновлял страницу.
 
Автор
T

Timerlan

Новичок
Сообщения
93
Репутация
0
Ну помогите пожалуйста, как мне сделать это чет ваще не получается.
 

ildar

Осваивающий
Сообщения
246
Репутация
28
Вопросы:
1. Скрипт запускается на сервере или на локальной машине?
2. Для чего это "создать, искать, заменить". Просто создать и закинуть(переписать) нельзя?
3. Скрипт для работы с одной локальной машиной или их будет несколько?
 
Автор
T

Timerlan

Новичок
Сообщения
93
Репутация
0
1. Скрипт запускается на сервере или на локальной машине?
Сами скрипты по созданию скриншота запускаются на локальной машине.
2. Для чего это "создать, искать, заменить". Просто создать и закинуть(переписать) нельзя?
Для чего это все. Создается пустая картинка для того чтоб, когда я захожу на сервак и смотрю на эти картинки чтоб я сразу видел где сделался скриншот где нет, ну просто сразу визуально будет видно. допустин у меня пустая картинка я сразу вижу опа нету связи. и ищу проблему. А у меня щас все норм сперва создает скриншот потом ищет на серваке с определенныи именем файл если он есть то удаляет и копирует скриншот на сервак. Вот но если вдруг на время пропало сеть то он не копирует получается то что он тока один раз проходит эту стадию копировани на сервак это тогда когда он создает скриншот а мне нужно чтоб он стадию копирование переодически прогонял если вдруг нескопировал на сервак.
3. Скрипт для работы с одной локальной машиной или их будет несколько?
У меня есть несколько машин и на каждой машине запущен скрипт. А на серваке создаются пустые картинки с разными именами напмимер у меня так noscreen_1,noscreen_2,noscreen_3,noscreen_4 и т.д соответсвенно в скрипте я тоже указываю какой файл мне искать и удалять.
 

ildar

Осваивающий
Сообщения
246
Репутация
28
Понятно теперь.
По второму пункту, может перед копирование проверять связь с сервом
Код:
$var = Ping($sIp, 4000)
If $var Then
    ; делаем копирование
    $connect = True ; связь есть
Else
    $connect = False ; связи нет
EndIf
 
Автор
T

Timerlan

Новичок
Сообщения
93
Репутация
0
И че тогда он получается не будет копировать до тех пор пока не появится связь?


Добавлено:
Сообщение автоматически объединено:

Это получается мне прям в функцию засунуть надо сюда
Код:
Func _MyScreen()
    Local $s_FileName, $f_Cursor = False, $s_date = StringFormat('%s.%s.%s.%s', @MDAY, @MON, @YEAR)
    If Not FileExists($s_Dir) Then DirCreate($s_Dir)
    $s_FileName = StringFormat('%s.%s.%s.%s %s.%s.%s.jpg', @ComputerName, @MDAY, @MON, @YEAR, @HOUR, @MIN, @SEC)
    _ScreenCapture_Capture($s_Dir & $s_FileName, 0, 0, @DesktopWidth, @DesktopHeight, $f_Cursor)
    $array_shar = _FileListToArray('C:\screen\' & $s_date, '*.jpg', 1)
    For $i = 1 To UBound($array_shar) - 1
      If StringInStr($array_shar[$i], 'NoScreen') Then
    FileDelete('C:\screen\' & $s_date & '\' & $array_shar[$i])
    FileCopy($s_Dir & '\' & $s_FileName, 'C:\screen\' & $s_date & '\' & $s_FileName)
    ExitLoop
EndIf
    Next
EndFunc
 

ildar

Осваивающий
Сообщения
246
Репутация
28
Как построишь.
Например
Код:
While 1
$var = Ping($sIp, 4000)
If $var Then
    ; FileCopy() делаем копирование
    $connect = True ; связь есть
    Exitloop
Else
    $connect = False ; связи нет
EndIf
Sleep(10000)
WEnd

Каждые 10 сек
Переменная $connect тут не нужна, можно ее использовать для логов(статистики) связи

по шагам
1. Сделал скриншот, он сохранился на локальном компе.
2. Проверяешь связь, если связь есть делается копирование
 
Автор
T

Timerlan

Новичок
Сообщения
93
Репутация
0
А прям с этой функцией пошаманить ни как да?
Код:
Func _MyScreen()
    Local $s_FileName, $f_Cursor = False, $s_date = StringFormat('%s.%s.%s.%s', @MDAY, @MON, @YEAR)
    If Not FileExists($s_Dir) Then DirCreate($s_Dir)
    $s_FileName = StringFormat('%s.%s.%s.%s %s.%s.%s.jpg', @ComputerName, @MDAY, @MON, @YEAR, @HOUR, @MIN, @SEC)
    _ScreenCapture_Capture($s_Dir & $s_FileName, 0, 0, @DesktopWidth, @DesktopHeight, $f_Cursor)
    $array_shar = _FileListToArray('C:\screen\' & $s_date, '*.jpg', 1)
    For $i = 1 To UBound($array_shar) - 1
      If StringInStr($array_shar[$i], 'NoScreen') Then
    FileDelete('C:\screen\' & $s_date & '\' & $array_shar[$i])
    FileCopy($s_Dir & '\' & $s_FileName, 'C:\screen\' & $s_date & '\' & $s_FileName)
    ExitLoop
EndIf
    Next
EndFunc
 

---Zak---

Скриптер
Сообщения
443
Репутация
116
Мой вариант создания скрина и связи с "сервером"

Код:
#include <ScreenCapture.au3>

;~ $IPServer 	= IP адрес сервера
;~ $IPDir 		= Shared папка на сервере, в котором скрины
;~ $IPFile 		= Имя файла

;~ $IPFile - если файл 'noscreen.jpg' на сервере будет один, то в локальной сети кто первый нашел файл и удалил его - того и тапочки
;~ В этом случае имя файла будет выглядеть так '<имя пк>_noscreen.jpg', в таком случае другие ПК будут искать исключительно свои файлы

Global $IPServer = '127.0.0.1', $IPDir = 'Screen', $IPFile = @ComputerName

CopyScreenToServer()

Func CopyScreenToServer()
	Local $f_Cursor = False
	While Not Ping($IPServer)
		Sleep(1000)
	WEnd
		$IPpath = '\\'&$IPServer&'\'&$IPDir
	If FileExists($IPpath&'\'&$IPFile&'_noscreen.jpg') Then
		FileDelete($IPpath&'\'&$IPFile&'_noscreen.jpg')
		_ScreenCapture_Capture($IPpath&'\'&$IPFile&'_'&@YEAR&'-'&@MON&'-'&@MDAY&'.jpg', 0, 0, @DesktopWidth, @DesktopHeight, $f_Cursor)
	EndIf
EndFunc
 

ildar

Осваивающий
Сообщения
246
Репутация
28
Код:
Func _MyScreen()
    Local $s_FileName, $f_Cursor = False, $s_date = StringFormat('%s.%s.%s.%s', @MDAY, @MON, @YEAR)
    If Not FileExists($s_Dir) Then DirCreate($s_Dir)
    $s_FileName = StringFormat('%s.%s.%s.%s %s.%s.%s.jpg', @ComputerName, @MDAY, @MON, @YEAR, @HOUR, @MIN, @SEC)
    _ScreenCapture_Capture($s_Dir & $s_FileName, 0, 0, @DesktopWidth, @DesktopHeight, $f_Cursor)
    
	While 1
         $var = Ping($sIp, 4000)
         If $var Then
            FileCopy($s_Dir & '\' & $s_FileName, 'C:\screen\' & $s_date & '\' & $s_FileName)
            $connect = True ; связь есть
            Exitloop
		 Else
			$connect = False ; связи нет
		 EndIf
       Sleep(10000)
    WEnd
EndFunc

Примерно так, без проверки наличия файла на серве.
 

---Zak---

Скриптер
Сообщения
443
Репутация
116
Timerlan
Да, что-то вроде... только у тебя много строк - я не разбирал.

У меня:
Пока нет пинга до ПК - уходить в слип.
Как только пинг есть, то проверяем наличие файла на сервере '<имя пк>_noscreen.jpg', то удалить файл '<имя пк>_noscreen.jpg' и сделать скрин '<имя пк>_гггг-мм-дд.jpg'
 
Автор
T

Timerlan

Новичок
Сообщения
93
Репутация
0
Короче да пинги это хорошо. Но мне нужно чтоб он постоянно проверял файлы на серваке. Ну распишу полностью. К примеру у меня делается скриншот и сохраняется он на локальной машине. Далее он идет на сервер и смотрит файл к примеру noscreen_1, если такой файл есть то начинает копирование, если нету то он уже не копирует на сервак а тока сохраняет у себя локально на машине. а мне нужно чтоб, он в любом случае скопировал как на сервере появится этот файл. К примеру ладно он первый раз скопировал все нормально, я взял и удалил его, я заново создаю пустую картинку и мне нужно чтоб он заново с локальной машины скопировал уже созданный скриншот. Данный сценарий который2 у меня есть к сожелению не может так сделать, где нужно подпилить сценарий.
 

---Zak---

Скриптер
Сообщения
443
Репутация
116
Подставить IP адрес сервера - куда будут сливаться скрины
Код:
$IPServer = ''

Изменить название расшаренной папки + предоставить доступ на чтение/запись
Код:
$IPDir = 'Screen'


Далее суть думаю разберешь
Код:
#include <ScreenCapture.au3>

HotKeySet('{Esc}', '_Exit') ;~ выход по ESC

;~ AdlibRegister("_ScreenPC", 60*60*1000) 	;~ каждый час делаем скрин
AdlibRegister("_ScreenPC", 5000) 			;~ каждые 5 секунд делаем скрин


Global $IPServer = '', $IPDir = 'Screen', $IPFile = @ComputerName

_ScreenPC()

While 1
	CopyScreenToServer()
	Sleep(10000) ;~ каждые 10 секунд проверять наличие файла и сливать его
WEnd


Func _ScreenPC()
	Local $f_Cursor = False
		FileMove(@ScriptDir&'\*.jpg', @ScriptDir&'\Screen\', 9)
	_ScreenCapture_Capture($IPFile&'_'&@YEAR&'-'&@MON&'-'&@MDAY&'-'&@HOUR&'-'&@MIN&'-'&@SEC&'.jpg', 0, 0, @DesktopWidth, @DesktopHeight, $f_Cursor)
EndFunc

Func CopyScreenToServer()
	If Ping($IPServer) Then
		$IPpath = '\\'&$IPServer&'\'&$IPDir
		If FileExists($IPpath&'\'&$IPFile&'_noscreen.jpg') Then
			FileDelete($IPpath&'\'&$IPFile&'_noscreen.jpg')
			FileCopy(@ScriptDir&'\*.jpg', $IPpath&'\')
		EndIf
	EndIf
EndFunc

Func _Exit()
	Exit
EndFunc
 
Верх