1 (изменено: Mambr, 2017-12-03 03:10:18)

Тема: AHK: Выполнение команды Run из переменной в файле txt или ini

Добрый день!

Как можно выполнить команду Run, считав ее параметры в виде переменной из текстового файла или ini?
Например, у меня скрипт читает Menu.txt в котором записаны стоки такого вида:


Notepad|notepad
Registry Workshop 1|"C:\Program Files\Registry Workshop\RegWorkshopX64.exe"
Registry Workshop 2|"%ProgramFiles%\Registry Workshop\RegWorkshopX64.exe"
Registry Workshop 3|% ProgramFiles64 "\Registry Workshop\RegWorkshopX64.exe"

Скрипт имеет примерно такое содержание (схематично):


#NoEnv
EnvGet SystemDrive, SystemDrive
EnvGet ProgramFiles64, ProgramW6432
MenuLst := A_ScriptDir "\Menu" ; текстовой файл без расширения

Loop read, % MenuLst
	{
	PointTxt := StrSplit(A_LoopReadLine, "|").1 ; получить имя запускаемой программы
	If (A_Index = "1") {
		Command1 := StrSplit(A_LoopReadLine, "|").2 ; получить команду запуска программы
		}

	бла бла бла .....

	}

Run % Command1
Run % Command2
Run % Command3
Run % Command4

Первая команда выполняется, т.е. - notepad , calc и прочая подобная фигня.
Вторая команда тоже выполняется, где указан конкретный path
С остальными большие проблемы.
Не понимает переменные ни в виндовом, ни в AHK формате.
Вываливает ошибку типа "Не могу найти запускаемый файл ... бла бла бля!"

Каким образом можно решить данный вопрос?

2

Re: AHK: Выполнение команды Run из переменной в файле txt или ini


;#include lib
msg := "[%A_Hour%:%A_Min%:%A_Sec%] Temp=%A_Temp%"
Msgbox % "Было: `n" msg "`nСтало: `n" ReplaceVariable(msg)

+ lib

ReplaceVariable(sMsg = "None") {
	if(sMsg = "None")
		return -1
	sMsg2 := sMsg
	Pos := 1, match := ""
	While Pos := RegExMatch(sMsg, "%(.*?)%", match, Pos+StrLen(match)){
		iArgCount += 1
		iArg%iArgCount% := RegExReplace(match, "%")
		iArg%iArgCount%_2 := % CheckVariable(iArg%iArgCount%)
		sMsg2 := RegExReplace(sMsg2, "%" iArg%iArgCount% "%", iArg%iArgCount%_2, 1)
	} Return sMsg2
}

CheckVariable(sMsg = "None") {
	Global HomeWork
	If(sMsg = "HomeWork")
		return HomeWork
	If(sMsg = "A_Space")
		return A_Space
	If(sMsg = "A_Tab")
		return A_Tab

	If(sMsg = "A_WorkingDir")
		return A_WorkingDir
	If(sMsg = "A_ScriptDir")
		return A_ScriptDir
	If(sMsg = "A_ScriptName")
		return A_ScriptName
	If(sMsg = "A_ScriptFullPath")
		return A_ScriptFullPath
	If(sMsg = "A_ScriptHwnd")
		return A_ScriptHwnd


	If(sMsg = "A_AhkVersion")
		return A_AhkVersion
	If(sMsg = "A_AhkPath")
		return A_AhkPath
	If(sMsg = "A_IsUnicode")
		return A_IsUnicode
	If(sMsg = "A_IsCompiled")
		return A_IsCompiled
	If(sMsg = "A_ExitReason")
		return A_ExitReason

	If(sMsg = "A_YYYY")
		return A_YYYY
	If(sMsg = "A_MM")
		return A_MM
	If(sMsg = "A_DD")
		return A_DD
	If(sMsg = "A_MMMM")
		return A_MMMM
	If(sMsg = "A_MMM")
		return A_MMM
	If(sMsg = "A_DDDD")
		return A_DDDD
	If(sMsg = "A_DDD")
		return A_DDD
	If(sMsg = "A_WDay")
		return A_WDay
	If(sMsg = "A_YDay")
		return A_YDay
	If(sMsg = "A_YWeek")
		return A_YWeek
	If(sMsg = "A_Hour")
		return A_Hour
	If(sMsg = "A_Min")
		return A_Min
	If(sMsg = "A_Sec")
		return A_Sec
	If(sMsg = "A_MSec")
		return A_MSec
	If(sMsg = "A_Now")
		return A_Now
	If(sMsg = "A_NowUTC")
		return A_NowUTC
	If(sMsg = "A_TickCount")
		return A_TickCount



	If(sMsg = "A_TimeIdle")
		return A_TimeIdle
	If(sMsg = "A_TimeIdlePhysical")
		return A_TimeIdlePhysical


	If(sMsg = "ComSpec")
		return ComSpec

	If(sMsg = "A_Temp")
		return A_Temp

	If(sMsg = "A_OSType")
		return A_OSType
	If(sMsg = "A_OSVersion")
		return A_OSVersion
	If(sMsg = "A_Is64bitOS")
		return A_Is64bitOS
	If(sMsg = "A_PtrSize")
		return A_PtrSize
	If(sMsg = "A_Language")
		return A_Language
	If(sMsg = "A_ComputerName")
		return A_ComputerName
	If(sMsg = "A_UserName")
		return A_UserName
	If(sMsg = "A_WinDir")
		return A_WinDir
	If(sMsg = "A_ProgramFiles")
		return A_ProgramFiles
	If(sMsg = "A_AppData")
		return A_AppData

	If(sMsg = "A_AppDataCommon")
		return A_AppDataCommon

	If(sMsg = "A_Desktop")
		return A_Desktop
	If(sMsg = "A_DesktopCommon")
		return A_DesktopCommon
	If(sMsg = "A_StartMenu")
		return A_StartMenu
	If(sMsg = "A_StartMenuCommon")
		return A_StartMenuCommon
	If(sMsg = "A_Programs")
		return A_Programs
	If(sMsg = "A_ProgramsCommon")
		return A_ProgramsCommon
	If(sMsg = "A_Startup")
		return A_Startup
	If(sMsg = "A_StartupCommon")
		return A_StartupCommon
	If(sMsg = "A_MyDocuments")
		return A_MyDocuments
	If(sMsg = "A_IsAdmin")
		return A_IsAdmin
	If(sMsg = "A_ScreenWidth")
		return A_ScreenWidth
	If(sMsg = "A_ScreenHeight")
		return A_ScreenHeight
	If(sMsg = "A_ScreenDPI")
		return A_ScreenDPI

	If(sMsg = "A_IPAddress1")
		return A_IPAddress1

	If(sMsg = "A_Cursor")
		return A_Cursor
	If(sMsg = "A_CaretX")
		return A_CaretX
	If(sMsg = "A_CaretY")
		return A_CaretY
	If(sMsg = "Clipboard")
		return Clipboard
	If(sMsg = "ClipboardAll")
		return ClipboardAll
	If(sMsg = "ErrorLevel")
		return ErrorLevel
	If(sMsg = "A_LastError")
		return A_LastError
	
	return "None"
}

3 (изменено: Mambr, 2017-12-03 12:43:07)

Re: AHK: Выполнение команды Run из переменной в файле txt или ini

MandarinKa02, спасибо огромное! Этот код работает.
Удалил из функции ненужное, добавил ProgramFiles, ProgramFiles64 и другое необходимое.

Единственный вопрос:


	If (sMsg = "ProgramFiles(x86)") {
		Return ProgramFiles
		}

не работает. Возврат, как есть - %ProgramFiles(x86)%
Как можно это исправить?

4 (изменено: MandarinKa02, 2017-12-21 19:52:32)

Re: AHK: Выполнение команды Run из переменной в файле txt или ini

Переписал функцию. Сам ее создал еще более года назад и не пользовался(на тот момент опыта было мало в регулярных выражениях и не учел этот момент).
Вот исправленный вариант:

+ Пример

var := "Hello, %MyName(for_friends)%!"
msgbox % ReplaceVariable(var)
reload

+ lib

ReplaceVariable(msg) {
	Pos := 1, match := ""
	While Pos := RegExMatch(msg, "%(.*?)%", match, Pos+StrLen(match)){
		argc += 1
		old := StrReplace(match, "%") ;Убираем "%"
		new := CheckVariable(old)     ;Получаем новую строку
		out := StrReplace(msg, "%" old "%", new)
	} return out
}

CheckVariable(msg = "None") {
	Global HomeWork ;Для глобальных переменных
	if(msg = "MyName(for_friends)")
		return "Bob"
	if(msg = "HomeWork")
		return HomeWork
	if(msg = "A_Space")
		return A_Space
	if(msg = "A_Tab")
		return A_Tab

	if(msg = "A_WorkingDir")
		return A_WorkingDir
	if(msg = "A_ScriptDir")
		return A_ScriptDir
	if(msg = "A_ScriptName")
		return A_ScriptName
	if(msg = "A_ScriptFullPath")
		return A_ScriptFullPath
	if(msg = "A_ScriptHwnd")
		return A_ScriptHwnd


	if(msg = "A_AhkVersion")
		return A_AhkVersion
	if(msg = "A_AhkPath")
		return A_AhkPath
	if(msg = "A_IsUnicode")
		return A_IsUnicode
	if(msg = "A_IsCompiled")
		return A_IsCompiled
	if(msg = "A_ExitReason")
		return A_ExitReason

	if(msg = "A_YYYY")
		return A_YYYY
	if(msg = "A_MM")
		return A_MM
	if(msg = "A_DD")
		return A_DD
	if(msg = "A_MMMM")
		return A_MMMM
	if(msg = "A_MMM")
		return A_MMM
	if(msg = "A_DDDD")
		return A_DDDD
	if(msg = "A_DDD")
		return A_DDD
	if(msg = "A_WDay")
		return A_WDay
	if(msg = "A_YDay")
		return A_YDay
	if(msg = "A_YWeek")
		return A_YWeek
	if(msg = "A_Hour")
		return A_Hour
	if(msg = "A_Min")
		return A_Min
	if(msg = "A_Sec")
		return A_Sec
	if(msg = "A_MSec")
		return A_MSec
	if(msg = "A_Now")
		return A_Now
	if(msg = "A_NowUTC")
		return A_NowUTC
	if(msg = "A_TickCount")
		return A_TickCount



	if(msg = "A_TimeIdle")
		return A_TimeIdle
	if(msg = "A_TimeIdlePhysical")
		return A_TimeIdlePhysical


	if(msg = "ComSpec")
		return ComSpec

	if(msg = "A_Temp")
		return A_Temp

	if(msg = "A_OSType")
		return A_OSType
	if(msg = "A_OSVersion")
		return A_OSVersion
	if(msg = "A_Is64bitOS")
		return A_Is64bitOS
	if(msg = "A_PtrSize")
		return A_PtrSize
	if(msg = "A_Language")
		return A_Language
	if(msg = "A_ComputerName")
		return A_ComputerName
	if(msg = "A_UserName")
		return A_UserName
	if(msg = "A_WinDir")
		return A_WinDir
	if(msg = "A_ProgramFiles")
		return A_ProgramFiles
	if(msg = "A_AppData")
		return A_AppData

	if(msg = "A_AppDataCommon")
		return A_AppDataCommon

	if(msg = "A_Desktop")
		return A_Desktop
	if(msg = "A_DesktopCommon")
		return A_DesktopCommon
	if(msg = "A_StartMenu")
		return A_StartMenu
	if(msg = "A_StartMenuCommon")
		return A_StartMenuCommon
	if(msg = "A_Programs")
		return A_Programs
	if(msg = "A_ProgramsCommon")
		return A_ProgramsCommon
	if(msg = "A_Startup")
		return A_Startup
	if(msg = "A_StartupCommon")
		return A_StartupCommon
	if(msg = "A_MyDocuments")
		return A_MyDocuments
	if(msg = "A_IsAdmin")
		return A_IsAdmin
	if(msg = "A_ScreenWidth")
		return A_ScreenWidth
	if(msg = "A_ScreenHeight")
		return A_ScreenHeight
	if(msg = "A_ScreenDPI")
		return A_ScreenDPI

	if(msg = "A_IPAddress1")
		return A_IPAddress1

	if(msg = "A_Cursor")
		return A_Cursor
	if(msg = "A_CaretX")
		return A_CaretX
	if(msg = "A_CaretY")
		return A_CaretY
	if(msg = "Clipboard")
		return Clipboard
	if(msg = "ClipboardAll")
		return ClipboardAll
	if(msg = "ErrorLevel")
		return ErrorLevel
	if(msg = "A_LastError")
		return A_LastError
	
	return "None"
}

5 (изменено: Mambr, 2017-12-03 21:17:10)

Re: AHK: Выполнение команды Run из переменной в файле txt или ini

MandarinKa02, еще раз большое спасибо!
Теперь все работает идеально!
Всего наилучшего!

6 (изменено: Mambr, 2017-12-04 07:41:29)

Re: AHK: Выполнение команды Run из переменной в файле txt или ini

Написал еще одну функцию конвертирования виндовых переменных в формат AHK с учетом архитектуры OS.

Вроде работает. Может кому-нить пригодится:



Prm1 := "%SystemDrive%"
Prm2 := "%ProgramFiles%"
Prm3 := "%ProgramFiles(x86)%"
Prm4 := """Бубль Гум"""

MsgBox % "Виндовая переменная ""%SystemDrive%"":`n"ReplVar(Prm1)
MsgBox % "Выхлоп AHK переменной ""ProgramFiles"" без учета архитектуры OS:`n" ProgramFiles
		. "`n`nУчитывая архитектуру OS:`n" ReplVar(Prm2)
		. "`n`nчто соответствует переменной Windows ""%ProgramFiles%"" любой архитектуры"
MsgBox % "Виндовая переменная ""%ProgramFiles(x86)%"":`n" ReplVar(Prm3)
MsgBox % Prm4 "`n`n" ReplVar(Prm4)

ReplVar(Prm) {
	EnvGet SystemDrive, SystemDrive
	EnvGet ProgramFiles64, ProgramW6432
	EnvGet ProgramFiles86, ProgramFiles(x86)
	
If InStr(Prm, "%SystemDrive%") {
	Prm := RegExReplace(Prm, "%(.*)%", SystemDrive)
	}
If InStr(Prm, "%ProgramFiles%") {
	If (GetOSarch() = "x64") {
		Prm := RegExReplace(Prm, "%(.*)%", ProgramFiles64)
		}
		Else {
			Prm := RegExReplace(Prm, "%(.*)%", ProgramFiles)
			}
	}
If InStr(Prm, "%ProgramFiles(x86)%") {
	Prm := RegExReplace(Prm, "%(.*)%", ProgramFiles86) ; или просто ProgramFiles, тогда EnvGet ProgramFiles86, ProgramFiles(x86) можно удалить
	}
If InStr(Prm, """Бубль Гум""") { ; просто прикол :)
	Prm := RegExReplace(Prm, """(.*)""", "Это ж $1!")
	}
Return Prm
}
;___________________________________________________________

GetOSarch() { ; получить архитектуру OS
	DllCall("IsWow64Process", "UInt", DllCall("GetCurrentProcess"), "UInt*", IsWow64Process)
Return IsWow64Process ? "x64":"x86"
}