折腾手记

运维!!运维!!

0%

AHK输出到当前命令行

AHK输出到当前命令行

autohotkey脚本是个GUI程序,本身没有console。因此需要输出到Stdout时,要么AllocConsole,要么AttachConsole。

下面的例子用到几个文件

1
2
3
test.ahk : 测试用的ahk
test.exe : 编译生成的exe
test.py : 配合测试的py

GUI环境启动AHK

如果在GUI环境启动一个autohotkey脚本,需要AllocConsole。

下面是AutoHokey V2帮助文件的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
DllCall("AllocConsole") ; 分配console

; Open the application's stdin/stdout streams.
stdin := FileOpen("*", "r")
stdout := FileOpen("*", "w")

stdout.Write("Enter your query.`n\> ")
stdout.Read(0) ; Flush the write buffer.
query := RTrim(stdin.ReadLine(), "`n")
stdout.WriteLine("Your query was '" query "'. Have a nice day.")
stdout.Read(0) ; Flush the write buffer.

Sleep 5000

命令行启动AHK

如果在命令行启动autohotkey脚本,可以AttachConsole到当前的Console,也可以AllocConsole。

如果AllocConsole,效果和GUI下一样,会再开启一个Console。

1
2
3
4
5
DllCall("AttachConsole", "uint", -1)

; Open the application's stdin/stdout streams.
stdout := FileOpen("*", "w")
stdout.Write("Hello World.")

不分配Console的结果

如果既不Alloc,也不Attach,而是直接输出到Stdout,无论在命令行还是GUI,运行都会报错。

1
2
3
; Open the application's stdin/stdout streams.
stdout := FileOpen("*", "w")
stdout.Write("Hello World.")

命令行的时候可以通过管道分配一个Console,程序能正常运行。

1
test.exe | write-host

子进程分配Console

用python写个简单的测试程序,能在命令行正确运行,也能得到结果,原因是子进程调用autohoktkey时,分配了一个console,python捕捉到结果ahk_res,print到当前命令行。

1
2
ahk_res = subprocess.check_output([r"autohotkey2", r"test.ahk"])
print(ahk_res.decode("utf-8"))

其它要注意的问题

有时从命令行上运行im-select2.exe时,下一条提示符比输出结果还要早,产生排版混乱,可以start -wait test.exe 或者 test.exe | write-host