1

Тема: AHK: Редактирование скрипта без ручного вмешательства.

Имею простой скрипт, который предлагает пользователю выбрать папку, а после по нажатию клавиши в этой папке создаётся текстовый файл и внутрь прописывается текст. Нужно сделать так, чтобы при первом открытие скрипта пользователь мог выбрать желаемую папку, путь к папке сохранился бы в переменной, а после каждого последующего открытия скрипта путь сохранялся и не нужно было бы указывать путь самостоятельно.

numpad6::

FileSelectFolder, OutputVar, , 3  ; выбрать путь к папке
if OutputVar =
    MsgBox, Вы не выбрали папку.
else
    MsgBox, Вы выбрали папку "%OutputVar%".
Return

numpad5::

FileAppend, Log`n, %OutputVar%\farmlog.txt  ; создать текстовый файл в выбранной папке 

Return

После первого открытия пользователь получит право выбрать папку по нажатию клавиши numpad6. Как сделать так, чтобы этот выбор как то сохранился в самом коде, чтобы после второго открытия скрипта (и последующих открытий) пользователю не нужно было выбирать путь, а он бы сохранился с первого открытия. Чтобы весь код нажатия на numpad6 не воспроизводился.

Если такое возможно подскажите пожалуйста.

2

Re: AHK: Редактирование скрипта без ручного вмешательства.

Обычно для сохранения данных между запусками скрипта используется ini-файл. Смотрите команды IniWrite, IniRead.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: nakutaru, 2025-04-18 18:36:17)

Re: AHK: Редактирование скрипта без ручного вмешательства.

teadrinker пишет:

Обычно для сохранения данных между запусками скрипта используется ini-файл. Смотрите команды IniWrite, IniRead.

Попытался сделать через ini-файл, однако столкнулся с проблемой.

numpad1::

FileSelectFolder, IniLogFolder, , 3, Укажите путь к папке куда будут сохраняться логи... ; выбрать путь к папке
if IniLogFolder =
    MsgBox, Вы не выбрали папку.
else
    MsgBox, Вы выбрали папку "%IniLogFolder%".
	sleep 100
	IniWrite, %IniLogFolder%, %IniLogFolder%\folder.ini, LogFolder, Folder ; создать INI файл и поместить в него путь
Return

numpad2::

IniRead, MyLogFolder, %IniLogFolder%\folder.ini, LogFolder, Folder ; обратиться к созданному INI и извлечь путь
sleep 100
FileAppend, Log`n, %MyLogFolder%\farmlog.txt  ; создать текстовый файл в выбранной папке 
Return

После выполнения блока кода при нажатии кнопки numpad1 создаётся ini файл там где указан путь при выборе, всё работает корректно. Однако как только я закрываю скрипт и после запускаю его заново, нажимаю numpad2 (моя идея изначальна была в том чтобы второй и последующий запуск скрипта работали без использования первого блока кода который активируется на numpad1) ничего не происходит потому что скрипт не может найти заданную переменную IniLogFolder которая была указана в первом блоке кода. Единственный вариант который придумал это поместить ini-файл в какую-нибудь из системных, рабочих папок (Например: C:\users\default), но если у пользователя будет указана другая буква наименования диска (Например: F), скрипт не будет работать. Ещё вопрос имеется, возможно ли как-то после использования первого блока кода, сделать так, чтобы скрипт сам дописал в код переменную с выбранным путём?

FileSelectFolder, LogFolder, , 3   ; При первом запуске Пользователь выберет путь и данные запишутся в LogFolder, при последующих запусках данная строка больше не понадобится

OutputFolder = ****   ; вместо "****" скрипт дописал путь из LogFolder. Например: C:\MyAHK

Чтобы в последующем скрипт мог обращаться к выбранному пути из переменной OutputFolder.

4

Re: AHK: Редактирование скрипта без ручного вмешательства.

По горячей клавише сначала считывайте папку из ini, если не считалось, предлагайте выбрать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Редактирование скрипта без ручного вмешательства.

teadrinker пишет:

По горячей клавише сначала считывайте папку из ini, если не считалось, предлагайте выбрать.

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

numpad1:: ; данная клавиша будет нажата при первом открытии скрипта, далее эта клавиша будет нажиматься только в случае если пользователь захочет сменить путь

FileSelectFolder, LogPath, , 3 ; выбор папки куда будет сохраняться текстовый файл, путь будет сохраняться в переменную LogPath

IniWrite, %LogPath%, %LogPath%\path.ini, LogPath, Path ; создать ini-файл в той же папке которую выбрал пользователь, в самом ini-файле будет скопирован путь этой папки
Return

numpad2:: ; эта клавиша будет нажата в любые моменты в отличие от первой клавиши, она отвечает за сохранение текста в текстовом документе, в той папке которую указал пользователь ранее

IniRead, MyLogPath, %LogPath%\folder.ini, LogPath, Path ; чтение ini-файла и попытка вынести оттуда путь который пользователь указал
FileAppend, Log`n, %MyLogPath%\log.txt ; внести текста лога в текстовый файл используя путь из ini-файла
Return

Проблема в данной строчке:

IniRead, MyLogPath, %LogPath%\folder.ini, LogPath, Path

Из-за того что пользователь указывает путь к папке один раз, при открытие скрипта, он сохраняет его в ini-файле. После открытия скрипта повторно путь уже сохранён в ini-файле (Этот файл будет лежать в указанной папке пользователем до тех пор пока пользователь не захочет сменить путь.) и нужно обратиться к этому файлу дабы вытащить оттуда путь к этой же папке, дабы там же создать текстовый файл и вписать в него текст.
Написал как вы посоветовали:

numpad1::

IniRead, MyLogPath, %IniLogPath%\path.ini, LogPath, Path, NoFindIni
if MyLogPath = NoFindIni
{
    FileSelectFolder, IniLogPath, , 3,
	IniWrite, %IniLogPath%, %IniLogPath%\path.ini, LogPath, Path
}

FileAppend, Log`n, %IniLogPath%\farmlog.txt
Return

При первом открытии после нажатия клавиши предложил выбрать папку куда сохранить файл ini. Выбрал, сохранил. После закрытия скрипта и открытия его, снова мне предложил выбрать папку куда сохранить ini файл. Нужно, чтобы при втором открытии не было предложения вновь сохранить ini файл (потому что при первом открытии он уже есть и сохранён), а сразу считал ini-файл и продолжил скрипт. Либо я возможно, что-то не понимаю.

6

Re: AHK: Редактирование скрипта без ручного вмешательства.

Не нужно цитировать предыдущий пост при ответе.
А зачем пользователю выбирать, где будет ini-файл? Просто сохраняйте его всегда либо в папке скрипта, либо где-нибудь в A_AppData.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Редактирование скрипта без ручного вмешательства.

Действительно, у меня была идея, чтобы скрипт был отдельно, а всё остальное в другом месте, но будто бы так действительно было проще.

Numpad1::

IniFile := A_ScriptDir . "\path.ini"
IniRead, MyLogPath, %IniFile%, LogPath, Path, NoFind

if MyLogPath = NoFind
{
    FileSelectFolder, MyLogPath, , 3, Выберите папку для логов
	if (ErrorLevel)
		return

	IniWrite, %MyLogPath%, %IniFile%, LogPath, Path
}

FileAppend, Log`n, %MyLogPath%\farmlog.txt
Return

Данный код решил проблему.