Command line 自动热键/AHK-函数内无法访问参数%1%

Command line 自动热键/AHK-函数内无法访问参数%1%,command-line,parameters,autohotkey,args,Command Line,Parameters,Autohotkey,Args,我在访问控制台在Autohotkey中传递给脚本的%1%启动参数时遇到问题 在函数外部使用以下代码时: Msgbox %1% 我获取已传递给脚本的参数的输出。但只要我使用以下代码: HelloWorld() { Msgbox %1% } HelloWorld() 输出为空 我还尝试将%1%分配给全局变量,或将其作为参数传递给函数,但对我来说也不起作用 谢谢我认为命令行参数变量被视为全局变量,因此为了在函数内部的非表达式上下文中使用它们,必须将它们声明为全局变量: HelloWorl

我在访问控制台在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()
注意,这样做不需要全局1

如果您使用的是最新版本的AHK,那么您可能希望使用新引入的内置变量,这是一个保存命令行参数的数组。它是内置的,不必声明为全局的,并且最终使代码更清晰:

HelloWorld() {
    MsgBox % "Number of command line args received: " A_Args.Length() "`n"
             . "First argument: " A_Args[1]
}
HelloWorld()

我认为命令行参数变量被视为全局变量,因此为了在函数内部的非表达式上下文中使用它们,必须将它们声明为全局变量:

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()
注意,这样做不需要全局1

如果您使用的是最新版本的AHK,那么您可能希望使用新引入的内置变量,这是一个保存命令行参数的数组。它是内置的,不必声明为全局的,并且最终使代码更清晰:

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,

只需在函数外部将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存在,但为空


嗯,

不为我工作。我有一个。也许我的AHK不支持A_Args。它是相当新的,添加在2017年底发布的1.1.27中。您使用的是什么版本?正如我在回答中提到的,声明为全局应该在函数def之外完成。因此,当您在函数外部声明cli变量时,您所说的不起作用的部分实际上起作用;无论哪种方式,您都要声明1个全局。如果在函数外部执行,1将成为一个变量,因此可用于所有非强制局部函数。无论如何,除非您需要支持旧版本,否则最好使用A_Args。不适用于我。我有一个。也许我的AHK不支持A_Args。它是相当新的,添加在2017年底发布的1.1.27中。您使用的是什么版本?正如我在回答中提到的,声明为全局应该在函数def之外完成。因此,当您在函数外部声明cli变量时,您所说的不起作用的部分实际上起作用;无论哪种方式,您都要声明1个全局。如果在函数外部执行,1将成为一个变量,因此可用于所有非强制局部函数。无论如何,除非您需要支持旧版本,否则应首选A_Args。