Что нового

Операции с открытием-закрытием файлов по времени компьютера

cerber412

Новичок
Сообщения
42
Репутация
0
Добрый день, друзья.
Помогите с решением проблемы.

Имеется скрипт, запускающий-закрывающий по хронометражу различные файлы, по их адресам.
Хронометраж и адреса файлов указаны в текстовом файле 1.txt
Но хронометраж этот - относительный, заданный вручную, то есть не привязанный ко времени на часах компьютера.
Код:
#include <Array.au3>
#include <Timers.au3>
Opt("TrayAutoPause", 0)
OnAutoItExitRegister("_OnExit")

Global $sTimingsPath = @ScriptDir & "\1.txt", $aTimings, $aOut, $iWait, $iTimer, $hScriptWnd
$aTimings = FileReadToArray($sTimingsPath)
If @error Then Exit MsgBox(16, "Ошибка", "Ошибка записи в текстовый файл.")
AutoItWinSetTitle(@ScriptFullPath)
$hScriptWnd = WinGetHandle(@ScriptFullPath)

$aOut = StringRegExp($aTimings[0], "([0-9]{2}):([0-9]{2}):([0-9]{2})", 1)
If @error Then Exit MsgBox(16, "Ошибка", "Не удалось получить общее время работы.")
$iTimer = _Timer_SetTimer($hScriptWnd, $aOut[0] * 3600000 + $aOut[1] * 60000 + $aOut[2] * 1000, "_TimerExit")
$hTimer = TimerInit()

Dim $aOpen[0]
; Вместо "з" в конце ставьте "/" в начале пути к файлу
For $i = 1 To UBound($aTimings) - 1
    $aOut = StringRegExp($aTimings[$i], "([0-9]{2}):([0-9]{2}):([0-9]{2}) (.+)", 1)
    If IsArray($aOut) Then
      $iWait = $aOut[0] * 3600000 + $aOut[1] * 60000 + $aOut[2] * 1000
      Do
            Sleep(10)
      Until TimerDiff($hTimer) >= $iWait
      If StringLeft($aOut[3], 1) <> "/" Then
         If FileExists($aOut[3]) Then
            _ArrayAdd($aOpen, ShellExecute($aOut[3]) & "@@@" & $aOut[3])
         Else
            ConsoleWrite("Файл не существует: " & $aOut[3] & @CRLF)
         EndIf
      Else
         For $j = 0 To UBound($aOpen) - 1
            If StringTrimLeft($aOut[3], 1) = StringSplit($aOpen[$j], "@@@", 1+2)[1] Then
               ProcessClose(StringSplit($aOpen[$j], "@@@", 1+2)[0])
            EndIf
         Next
      EndIf
   EndIf

Next

While 1
    Sleep(10)
WEnd

Func _TimerExit($hWnd, $uMsg, $IDTimer, $dwTime)
    Exit
EndFunc   ;==>_TimerExit

Func _OnExit()
    _Timer_KillTimer($hScriptWnd, $iTimer)
EndFunc   ;==>_OnExit

Подскажите - как заставить скрипт запускать нужный файл - если время напротив адреса файла - совпадет со временем на часах компьютера ?
 

Вложения

  • 1,2 КБ Просмотры: 6

hedji

Продвинутый
Сообщения
408
Репутация
89
Код:
$str = "18;54;00;notepad.exe"
$str = StringSplit($str, ";", 2)
if @HOUR = $str[0] And @MIN = $str[1] Then
	Run($str[3])
EndIf
 
Автор
C

cerber412

Новичок
Сообщения
42
Репутация
0
hedji, не работает.
Скрипт ничего не запускает.
 

joiner

Модератор
Локальный модератор
Сообщения
3 338
Репутация
574
cerber412, пример от hedji рабочий.
в твоем коде рано срабатывает _TimerExit. Не доходит до запуска файлов
 
Автор
C

cerber412

Новичок
Сообщения
42
Репутация
0
joiner, как код от hedji может быть рабочим, когда в нем нет ссылки на текстовый файл 1.txt (где приведены ссылки на файлы) ?

Откуда этот скрипт - названия файлов тогда берет ?
 

joiner

Модератор
Локальный модератор
Сообщения
3 338
Репутация
574
Запусти отдельно код и увидишь
 

gunter123

Продвинутый
Сообщения
157
Репутация
67
В следующий раз, пожалуйста, сформулируйте сразу весь список требований к скрипту, а не создавайте по одной теме
Код:
#include <Array.au3>

HotKeySet("{ESC}", "_Exit")
Func _Exit()
   Exit
EndFunc

Global $aFiles = FileReadToArray(@ScriptDir & "\1.txt")
Dim $aOpen[0]

For $i = 0 To UBound($aFiles) -1
   $aTime = StringSplit(StringLeft($aFiles[$i], 8), ":", 2)
   ConsoleWrite("Ждем " & $aFiles[$i] & @CRLF)
   While Sleep(500)
	  If @HOUR = $aTime[0] AND @MIN = $aTime[1] AND @SEC = $aTime[2] Then
		 ExitLoop
	  EndIf
   WEnd

   $sName = StringTrimLeft($aFiles[$i], 9)

   If StringLeft($sName, 1) <> "/" Then
	  If FileExists($sName) Then
         _ArrayAdd($aOpen, ShellExecute($sName) & "@@@" & $sName)
      Else
         ConsoleWrite("Файл не существует: " & $sName & @CRLF)
      EndIf
   Else
      For $j = 0 To UBound($aOpen) - 1
         If StringTrimLeft($sName, 1) = StringSplit($aOpen[$j], "@@@", 1+2)[1] Then
            ProcessClose(StringSplit($aOpen[$j], "@@@", 1+2)[0])
         EndIf
      Next
   EndIf

Next
 
Автор
C

cerber412

Новичок
Сообщения
42
Репутация
0
gunter123, заработало !!!
Большое спасибо.
Чувствуется рука мастера.
 
Верх