AHK 如何在函数内将变量传递给 "Run"?
AHK How to pass variables to "Run" inside a function?
我对 autohotkey 还很陌生,最近 运行 在尝试将变量作为参数传递给 autohotkey 中的“运行”命令时遇到了一个问题。谁能告诉我我遗漏了什么或者这是一个错误?
Gui, Setup:Add, Edit, w100 vProgram
Gui, Setup:Add, Button, Default w100 gSubmit, OK
Gui, Setup:Show,, Setup
WinWaitClose, Setup
ExitApp
Submit:
Gui, Setup:Submit
RunStuff()
RunStuff() {
Run, %Program%
}
我什至尝试将行更改为:
RunStuff() {
run, Program
}
在此先感谢您的帮助。
要事第一,而
WinWaitClose, Setup
ExitApp
也许是个聪明的想法,你应该通过定义一个名为 GuiClose
.
的函数(或标签)来使用 GuiClose
event 来做到这一点
GuiClose()
{
ExitApp
}
此外,给图形用户界面命名是多余的,但如果您打算添加更多图形用户界面,这很公平。
对于 运行 cmd 命令,您将使用 /c
(docs) 开关启动 cmd。
您的示例 netsh wlan connect ssid=%networkname% name=%networkname%
将像这样完成:
networkname := "name"
Run, %A_ComSpec% /c netsh wlan connect ssid=%networkname% name=%networkname%
Run, % A_ComSpec " /c netsh wlan connect ssid=" networkname " name=" networkname
第一行是旧语法,我真的不推荐它。
第二行是表达式语法。
内置变量 A_ComSpec
(docs) 包含 cmd.exe.
的路径
根据您的代码在记事本中打开文件的示例程序:
Gui, Setup:Add, Edit, w300 vFilePath, % "C:\Users\User\Desktop\this is a text file.txt"
Gui, Setup:Add, Button, Default w100 gSubmit, OK
Gui, Setup:Show, , Setup
return
Submit:
Gui, Setup:Submit
Run, % "notepad.exe """ FilePath """"
return
GuiClose()
{
ExitApp
}
注意文件路径如何包含空格,因此参数需要用引号引起来。
""""
可能看起来很奇怪,但是在 AHK 中引用是 escaped 和另一个引用。因此外引号指定您正在编写字符串,而内引号 ""
只是一个引号转义。所以这会产生 "
.
在学习 AHK 时,遗留语法与现代表达式语法可能有点混乱。查找内容时,您会看到很多遗留语法。这主要是因为 AHK 在多年前就很流行(当时使用遗留语法)。
要了解遗留与现代表达差异,这里有一个非常好的文档页面:
https://www.autohotkey.com/docs/Language.htm
编辑:
通过对 OP 的编辑添加的新问题的答案。
RunStuff() {
Run, %Program%
}
函数范围内未定义变量 Program
。
让我们考虑这个示例代码
var1 := 1
var2 := 2
global var3 := 3
function()
return
function()
{
global var2
MsgBox, % "var1: " var1 "`nvar2: " var2 "`nvar3: " var3 "`n"
}
var1
未在函数范围内定义,因此消息框中不会打印任何内容。
由于 global var2
.
行,var2
将从函数范围之外使用
var3
也可以从函数范围之外使用,因为 var3 被定义为超级全局。超级全局并不真正推荐,因为任何地方都会使用该变量。 运行 很容易解决较大脚本的问题,但对于较小的脚本来说很方便,因为您知道自己将要做什么并且没有任何外部库,例如。
您可以从这里阅读相关文档:
https://www.autohotkey.com/docs/Functions.htm#Locals
看来您认为您的问题出在 gui 输出上。
我想你可能想用不同的方式检查一下:
您可以创建一个脚本来分析您的 运行 输入。
例如:
脚本#1,我们称它为“1.ahk”
Run, 2.ahk param1 param 2 "param 3"
脚本#2,我们称之为“2.ahk”
txt := "Params as seen by ahk:`n"
for i, param in A_Args
txt .= i " = " param "`n"
MsgBox % txt
通过运行ning脚本“1.ahk”你可以看到“2.ahk”创建的消息:
Params as seen by ahk:
1 = param1
2 = param
3 = 2
4 = param 3
我认为这很好地说明了它如何理解空格,以及引号如何防止分裂参数。
现在,如果您 运行 您的 gui 输出针对“2.ahk”,您可能会看到与之前看到的不同的东西。
我对 autohotkey 还很陌生,最近 运行 在尝试将变量作为参数传递给 autohotkey 中的“运行”命令时遇到了一个问题。谁能告诉我我遗漏了什么或者这是一个错误?
Gui, Setup:Add, Edit, w100 vProgram
Gui, Setup:Add, Button, Default w100 gSubmit, OK
Gui, Setup:Show,, Setup
WinWaitClose, Setup
ExitApp
Submit:
Gui, Setup:Submit
RunStuff()
RunStuff() {
Run, %Program%
}
我什至尝试将行更改为:
RunStuff() {
run, Program
}
在此先感谢您的帮助。
要事第一,而
WinWaitClose, Setup
ExitApp
也许是个聪明的想法,你应该通过定义一个名为 GuiClose
.
GuiClose
event 来做到这一点
GuiClose()
{
ExitApp
}
此外,给图形用户界面命名是多余的,但如果您打算添加更多图形用户界面,这很公平。
对于 运行 cmd 命令,您将使用 /c
(docs) 开关启动 cmd。
您的示例 netsh wlan connect ssid=%networkname% name=%networkname%
将像这样完成:
networkname := "name"
Run, %A_ComSpec% /c netsh wlan connect ssid=%networkname% name=%networkname%
Run, % A_ComSpec " /c netsh wlan connect ssid=" networkname " name=" networkname
第一行是旧语法,我真的不推荐它。
第二行是表达式语法。
内置变量 A_ComSpec
(docs) 包含 cmd.exe.
根据您的代码在记事本中打开文件的示例程序:
Gui, Setup:Add, Edit, w300 vFilePath, % "C:\Users\User\Desktop\this is a text file.txt"
Gui, Setup:Add, Button, Default w100 gSubmit, OK
Gui, Setup:Show, , Setup
return
Submit:
Gui, Setup:Submit
Run, % "notepad.exe """ FilePath """"
return
GuiClose()
{
ExitApp
}
注意文件路径如何包含空格,因此参数需要用引号引起来。
""""
可能看起来很奇怪,但是在 AHK 中引用是 escaped 和另一个引用。因此外引号指定您正在编写字符串,而内引号 ""
只是一个引号转义。所以这会产生 "
.
在学习 AHK 时,遗留语法与现代表达式语法可能有点混乱。查找内容时,您会看到很多遗留语法。这主要是因为 AHK 在多年前就很流行(当时使用遗留语法)。
要了解遗留与现代表达差异,这里有一个非常好的文档页面:
https://www.autohotkey.com/docs/Language.htm
编辑:
通过对 OP 的编辑添加的新问题的答案。
RunStuff() {
Run, %Program%
}
函数范围内未定义变量 Program
。
让我们考虑这个示例代码
var1 := 1
var2 := 2
global var3 := 3
function()
return
function()
{
global var2
MsgBox, % "var1: " var1 "`nvar2: " var2 "`nvar3: " var3 "`n"
}
var1
未在函数范围内定义,因此消息框中不会打印任何内容。
由于 global var2
.
行,var2
将从函数范围之外使用
var3
也可以从函数范围之外使用,因为 var3 被定义为超级全局。超级全局并不真正推荐,因为任何地方都会使用该变量。 运行 很容易解决较大脚本的问题,但对于较小的脚本来说很方便,因为您知道自己将要做什么并且没有任何外部库,例如。
您可以从这里阅读相关文档:
https://www.autohotkey.com/docs/Functions.htm#Locals
看来您认为您的问题出在 gui 输出上。
我想你可能想用不同的方式检查一下:
您可以创建一个脚本来分析您的 运行 输入。
例如:
脚本#1,我们称它为“1.ahk”
Run, 2.ahk param1 param 2 "param 3"
脚本#2,我们称之为“2.ahk”
txt := "Params as seen by ahk:`n"
for i, param in A_Args
txt .= i " = " param "`n"
MsgBox % txt
通过运行ning脚本“1.ahk”你可以看到“2.ahk”创建的消息:
Params as seen by ahk:
1 = param1
2 = param
3 = 2
4 = param 3
我认为这很好地说明了它如何理解空格,以及引号如何防止分裂参数。
现在,如果您 运行 您的 gui 输出针对“2.ahk”,您可能会看到与之前看到的不同的东西。