Autohotkey / AHK - 参数 %1% 在函数中不可访问
Autohotkey / AHK - Param %1% not accessible within a function
我在访问 Autohotkey 中的 %1%(已由控制台传递给脚本的启动参数)时遇到问题。
当我使用以下代码(在函数之外)时:
Msgbox %1%
我得到了传递给脚本的参数的输出。但是一旦我使用以下代码:
HelloWorld() {
Msgbox %1%
}
HelloWorld()
输出为空。
我也尝试过将 %1% 分配给全局变量,或将其作为参数传递给函数,但对我来说都不起作用。
谢谢
我认为命令行参数变量被认为是全局变量,因此为了在函数内的非表达式上下文中使用它们,您必须将它们声明为全局变量:
HelloWorld() {
global 1
Msgbox %1%
}
HelloWorld()
一旦您想在表达式中使用它们(例如在 MsgBox
的文本参数中使用 %
),它会变得更加混乱,因为它们将被视为数字,因此您必须通过变量间接访问它们:
HelloWorld() {
;global 1
; Neither of these two expressions access the variable named "1"
;Msgbox % 1
;Msgbox % %1%
; You have to do this instead:
p := 1
MsgBox % %p% ; p is translated to 1 and then "1" is used as a variable name
}
HelloWorld()
请注意,这样做不需要 global 1
。
如果您使用的是最新版本的 AHK,您可能想要使用新引入的内置变量 A_Args
,它是一个保存命令行参数的数组。由于是内置的,它不必声明为全局的,最终使代码更清晰:
HelloWorld() {
MsgBox % "Number of command line args received: " A_Args.Length() "`n"
. "First argument: " A_Args[1]
}
HelloWorld()
只需将您的 cli 变量声明为全局变量 - 在函数外部 - 使它们全局可用 到 任何和所有内部函数。对我来说,这就是我使用 AHK 版本(版本 1.1.25.01)的方式:
Global 1, 2, 3
HelloWorld() {
MsgBox Hello`t1:`t%1%`n`t2:`t%2%`n`t3:`t%3%
}
HelloWorld()
注意,这些是不同的命令行:
"Scripts\myScript.ahk" one two three
"Scripts\myScript.ahk" "one two" three
"Scripts\myScript.ahk" "one" "two three"
"Scripts\myScript.ahk" "one two three"
第一个是三个独立的参数,第二个和第三个只有两个,最后一个只有一个参数(2和3存在,但为空)。
Hth,
我在访问 Autohotkey 中的 %1%(已由控制台传递给脚本的启动参数)时遇到问题。
当我使用以下代码(在函数之外)时:
Msgbox %1%
我得到了传递给脚本的参数的输出。但是一旦我使用以下代码:
HelloWorld() {
Msgbox %1%
}
HelloWorld()
输出为空。
我也尝试过将 %1% 分配给全局变量,或将其作为参数传递给函数,但对我来说都不起作用。
谢谢
我认为命令行参数变量被认为是全局变量,因此为了在函数内的非表达式上下文中使用它们,您必须将它们声明为全局变量:
HelloWorld() {
global 1
Msgbox %1%
}
HelloWorld()
一旦您想在表达式中使用它们(例如在 MsgBox
的文本参数中使用 %
),它会变得更加混乱,因为它们将被视为数字,因此您必须通过变量间接访问它们:
HelloWorld() {
;global 1
; Neither of these two expressions access the variable named "1"
;Msgbox % 1
;Msgbox % %1%
; You have to do this instead:
p := 1
MsgBox % %p% ; p is translated to 1 and then "1" is used as a variable name
}
HelloWorld()
请注意,这样做不需要 global 1
。
如果您使用的是最新版本的 AHK,您可能想要使用新引入的内置变量 A_Args
,它是一个保存命令行参数的数组。由于是内置的,它不必声明为全局的,最终使代码更清晰:
HelloWorld() {
MsgBox % "Number of command line args received: " A_Args.Length() "`n"
. "First argument: " A_Args[1]
}
HelloWorld()
只需将您的 cli 变量声明为全局变量 - 在函数外部 - 使它们全局可用 到 任何和所有内部函数。对我来说,这就是我使用 AHK 版本(版本 1.1.25.01)的方式:
Global 1, 2, 3
HelloWorld() {
MsgBox Hello`t1:`t%1%`n`t2:`t%2%`n`t3:`t%3%
}
HelloWorld()
注意,这些是不同的命令行:
"Scripts\myScript.ahk" one two three
"Scripts\myScript.ahk" "one two" three
"Scripts\myScript.ahk" "one" "two three"
"Scripts\myScript.ahk" "one two three"
第一个是三个独立的参数,第二个和第三个只有两个,最后一个只有一个参数(2和3存在,但为空)。
Hth,