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”,您可能会看到与之前看到的不同的东西。