1

Тема: AHK: Запись даты на новой строке при нажатии на клавишу.

Здравствуйте.
Помогите решить вопрос.
Как скриптом при нажатии на любую клавишу клавиатуры - добавить с перезаписью единицу в файл "16.txt" и проставить текущую дату ?

Запись в txt будет выглядеть так:
"Какой-то текст 1 22.01.2019"

Если нажать на любую клавишу еще раз, то этот текст заменится на следующий:
"Какой-то текст 2 22.01.2019"

Но если нажать на клавишу - на другой день, то скрипт создаст новою аналогичную запись - на новой строке - поскольку дата изменится.

2 (изменено: KusochekDobra, 2019-01-04 20:22:50)

Re: AHK: Запись даты на новой строке при нажатии на клавишу.

Годится?


#SingleInstance, Force
#NoEnv
SetWorkingDir, A_ScriptDir

Global	counter		:= 1
		, storage	:= "16.txt"
		, template	:= "Какой-то текст {} {}.{}.{}"
		, storageContent

	
if !(FileExist(storage)) {
	FileAppend,% Format(template, 0, A_DD, A_MM, A_YYYY),% storage, UTF-8
	storageContent := ""
} else if (IsMatched()) {
	oFile := FileOpen(storage, "r", "UTF-8")
	oFile.Seek(-20)
	content := oFile.Read()
	oFile.Close()
	RegExMatch(content, ".* ([\d]+) [\d\.]+", m)
	counter := m1 + 1
}

i := 8
Loop 247
   Hotkey, % "~vk" . Format("{:X}", i++), WatchPress, On
Return
WatchPress() {
   oFile := FileOpen(storage, "w", "UTF-8")
   str := Format(template, IsMatched() ? counter++ : counter++, A_DD, A_MM, A_YYYY)
   oFile.Write(Format("{}{}{}",storageContent, storageContent ? "`n`n" : "", str))
   oFile.Close()
}
IsMatched() {
	FileGetTime, storageTime,% storage
	FormatTime, storageYDay,% storageTime, YDay
	FormatTime, storageYear,% storageTime, yyyy
	if (storageYear == A_YYYY && storageYDay == A_YDay)
		Return true
		
	oFile := FileOpen(storage, "r", "UTF-8")
	storageContent := oFile.Read()
	oFile.Close()
	counter := 1
	Return false
}

3 (изменено: radioamator, 2019-01-05 05:51:33)

Re: AHK: Запись даты на новой строке при нажатии на клавишу.

KusochekDobra,все нормально, только скрипт - на смену даты неправильно реагирует.
Он полностью перезаписывает содержимое файла txt - под новую дату.

Как этот код научить - при наступлении новой даты (нового дня) - тут же создавать новую аналогичную строку в txt ?
Чтобы при смене даты получился примерно такой текст:
Нажато клавиш 816 04.01.2019
Нажато клавиш 2 05.01.2019

4

Re: AHK: Запись даты на новой строке при нажатии на клавишу.


#SingleInstance, Force
#NoEnv
SetWorkingDir, A_ScriptDir

Global	counter		:= 1
		, storage	:= "16.txt"
		, template	:= "Нажато клавиш {} {}.{}.{}"
		, storageContent := ""

if !(FileExist(storage)) {
	FileAppend,% Format(template, 0, A_DD, A_MM, A_YYYY),% storage, UTF-8
} else if (IsMatched()) {
	oFile := FileOpen(storage, "r", "UTF-8")
	lines := StrSplit(oFile.Read(), "`r`n")
	oFile.Close()
	Loop,% n := lines.Length() - 1 
		storageContent .= lines[ A_Index ] (A_Index != n ? "`r`n" : "")
	RegExMatch(lines[lines.Length()], ".* ([\d]+) [\d\.]+", m)
	counter := m1 + 1
}

i := 8
Loop 247
   Hotkey, % "~vk" . Format("{:X}", i++), WatchPress, On
Return
WatchPress() {
   oFile := FileOpen(storage, "w", "UTF-8")
   str := Format(template, IsMatched() ? counter++ : counter++, A_DD, A_MM, A_YYYY)
   oFile.Write(Format("{}{}{}",storageContent, storageContent ? "`r`n" : "", str))
   oFile.Close()
}
IsMatched() {
	FileGetTime, storageTime,% storage
	FormatTime, storageYDay,% storageTime, YDay
	if (storageYDay == A_YDay)
		Return true
		
	oFile := FileOpen(storage, "r", "UTF-8")
	storageContent := oFile.Read()
	oFile.Close()
	counter := 1
	Return false
}

5

Re: AHK: Запись даты на новой строке при нажатии на клавишу.

KusochekDobra, не работает.
При смене даты (наступление нового дня) - скрипт просто переписывает старую строку.
Таким образом - в файле все время одна-единственная строка, которую скрипт при смене даты - просто переписывает заново.

6 (изменено: teadrinker, 2019-01-05 21:38:54)

Re: AHK: Запись даты на новой строке при нажатии на клавишу.

Так, наверно:

storage := A_ScriptDir . "\16.txt"
template := "Нажато клавиш: "

WatchPress := Func("WatchPress").Bind(storage, template)
Loop 248
   Hotkey, % "~" . Format("vk{:X}", A_Index + 7), % WatchPress, On
Return

WatchPress(filePath, template)  {
   Critical
   date := A_DD . "." . A_MM . "." . A_YEAR
   oFile := FileOpen(filePath, "rw", "cp0")
   content := oFile.Read()
   RegExMatch(content, "s)(.*\R)?\K.*?(?<PressCount>\d+)\s(?<Date>\d\d\.\d\d\.\d{4})$", lastStr)
   dateFit := date = lastStrDate
   newLastStr := ( (lastStr && !dateFit) ? "`r`n" : "" ) . template . (dateFit ? ++lastStrPressCount : "1" ) . " " . date
   if dateFit
      oFile.Pos -= StrLen(lastStr), oFile.Length := oFile.Pos
   oFile.Write(newLastStr)
   oFile.Close()
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Запись даты на новой строке при нажатии на клавишу.

teadrinker спасибо. Заработало.