我如何 运行 来自 powershell 的 AutoIT 脚本
How can I run AutoIT scripts from powershell
我有这个脚本:
#Region
#AutoIt3Wrapper_UseUpx=n
#EndRegion
Global $SUPERBARPOS
$SUPERBARPOS = WinGetPos("[CLASS:Shell_TrayWnd]")
MsgBox(0, "Testing...", _
"Taskbar's attributes: x:" & $SUPERBARPOS[0] & _
" y:" & $SUPERBARPOS[1] & _
" w:" & $SUPERBARPOS[2] & _
" h:" & $SUPERBARPOS[3] & @CRLF & _
"Superbar condition: " & _taskbarHidden())
Func _taskbarHidden()
Local Const $ABM_GETSTATE = 4, $ABS_AUTOHIDE = 1, $ABS_ONTOP = 2
Local $ARETURN
$ARETURN = DllCall("shell32.dll", "uint", "SHAppBarMessage", "dword", $ABM_GETSTATE, "ptr*", 0)
If @error Then Return SetError(1, 0, 0)
If BITAND($ARETURN[0], $ABS_AUTOHIDE) Then
Return "Auto hide is enabled"
Else
Return "Auto hide is disabled"
EndIf
EndFunc
Func _getSuperbarPos2()
Local Const $ABM_GETTASKBARPOS = 5
Local Const $ABE_LEFT = 0
Local Const $ABE_TOP = 1
Local Const $ABE_RIGHT = 2
Local Const $ABE_BOTTOM = 3
Local $ARETURN
Global $_POSITIONS[4] = ["Left", "Top", "Right", "Bottom"]
Global $TAG_APPBARDATA = "LONG;HWND;INT;INT;STRUCT;INT;INT;INT;INT;ENDSTRUCT"
Local $PDATA = DllStructCreate($TAG_APPBARDATA)
DllStructSetData($PDATA, 1, DllStructGetSize($PDATA))
DllStructSetData($PDATA, 2, WinGetHandle("[CLASS:Shell_TrayWnd]", ""))
Local $ARESULT = DllCall("Shell32.dll", "BOOL", "SHAppBarMessage", "DWORD", $ABM_GETTASKBARPOS, "ptr", DllStructGetPtr($PDATA))
If @error Then Return SetError(@error, 0, -1)
If Not $ARESULT[0] Then Return SetError($ARESULT[0], 0, -2)
Return $_POSITIONS[DllStructGetData($PDATA, 4)]
EndFunc
有没有办法将它转换为 Powershell,或者如果这不可能,我如何再次使用 powershell 提取例如“&$SUPERBARPOS[1]&”?
更具体地说,我想在 powershell 中编写一个命令,然后使用该 AutoIT 脚本在 powershell 中查看打印的结果。
从 Powershell one 调用 Autoit 脚本
这是最简单的选项。
PowerShell 允许通过函数调用运算符 &
后跟程序路径及其参数来执行任意程序:
& "c:\path\to\program.exe" "parameter1" "parameter2" "parameter3"
所以在 AutoIT 的情况下 运行 您需要编写一个脚本:
在 64 位系统上:
& "${env:ProgramFiles(x86)}\AutoIt3\AutoIt3.exe" "/AutoIt3ExecuteScript" "c:\your_script.au3"
在 32 位系统上:
& "${env:ProgramFiles}\AutoIt3\AutoIt3.exe" "/AutoIt3ExecuteScript" "c:\your_script.au3"
${env:ProgramFiles(x86)}
替换具有 Program files (x86)
文件夹完整路径的环境变量,很可能是 c:\Program files (x86)
AutoIt3.exe
是实际执行未编译的 autoit 脚本(au3
文本文件)的程序。 /AutoIt3ExecuteScript
告诉它作为脚本执行下一个参数,但通常可以省略。
通过文件将数据从 AutoIT 传递到 PowerShell
有很多方法可以将数据从一个脚本传递到另一个脚本,但是对新手最友好的方法似乎是将数据存储在一个临时文本文件中,尽管它有点低效。
在 AutoIT 脚本中,将以 MSGBOX
开头的行替换为:
FileDelete("c:\myfile.txt")
FileWrite("c:\myfile.txt", $SUPERBARPOS[1])
如果文件已经存在,第一行删除文件 - 否则将追加。
第二行将$SUPERBARPOS[1]
的内容写入文件。
脚本完成后,您可以用记事本打开文件,查看是否包含您想要的文件。
在 Powershell 中读取文件也很容易:
$myvar = [IO.File]::ReadAllText("c:\myfile.txt")
这会将整个文件的内容复制到名为 $myvar
的变量中
传递数据而不创建文件
当然,用临时文件乱丢硬盘并不是最好的主意。
在按顺序执行的程序之间传递数据的一种好方法是管道,最显着的是 STDIN 和 STDOUT。
为此:
- 将 AutoIT 脚本编译为控制台应用程序(参见
Autoit2exe
命令行文档 and/or #AutoIt3Wrapper_Change2CUI=y
编辑指令 )
- 用类似的东西替换
MSGBOX
行
ConsoleWrite($SUPERBARPOS[1] & @CRLF)
或类似的。
这应该将变量作为文本转储到控制台 window
默认情况下(你不会看到它,除非你 运行 你的脚本来自
命令行或 powershell window)
要将文本重定向到变量中,只需调用您的
像这样的脚本:
$myvar = & c:\your_script.exe
如果需要传递多个变量,则需要在 PowerShell 端将它们分开。为此,您可能需要执行以下操作:
$a = $myvar -split "`r`n"
将脚本转换为 PowerShell
因为 AutoIT 和 PowerShell 是两种完全不同的语言,所以没有自动转换工具。要翻译代码,您需要了解 AutoIT 代码并在 PowerShell 中手动编写类似代码。为此,您显然需要充分了解 AutoIT 和 PowerShell 语言。
据我所知,这个脚本基本上调用了几个 WinAPI DLL 函数。 DllCall(). PowerShell appears to allow this with Add-Type.
中很好地描述了流程的 autoit 方面
如果您 运行 在进行转换时遇到障碍,请提出更具体的问题。
我有这个脚本:
#Region
#AutoIt3Wrapper_UseUpx=n
#EndRegion
Global $SUPERBARPOS
$SUPERBARPOS = WinGetPos("[CLASS:Shell_TrayWnd]")
MsgBox(0, "Testing...", _
"Taskbar's attributes: x:" & $SUPERBARPOS[0] & _
" y:" & $SUPERBARPOS[1] & _
" w:" & $SUPERBARPOS[2] & _
" h:" & $SUPERBARPOS[3] & @CRLF & _
"Superbar condition: " & _taskbarHidden())
Func _taskbarHidden()
Local Const $ABM_GETSTATE = 4, $ABS_AUTOHIDE = 1, $ABS_ONTOP = 2
Local $ARETURN
$ARETURN = DllCall("shell32.dll", "uint", "SHAppBarMessage", "dword", $ABM_GETSTATE, "ptr*", 0)
If @error Then Return SetError(1, 0, 0)
If BITAND($ARETURN[0], $ABS_AUTOHIDE) Then
Return "Auto hide is enabled"
Else
Return "Auto hide is disabled"
EndIf
EndFunc
Func _getSuperbarPos2()
Local Const $ABM_GETTASKBARPOS = 5
Local Const $ABE_LEFT = 0
Local Const $ABE_TOP = 1
Local Const $ABE_RIGHT = 2
Local Const $ABE_BOTTOM = 3
Local $ARETURN
Global $_POSITIONS[4] = ["Left", "Top", "Right", "Bottom"]
Global $TAG_APPBARDATA = "LONG;HWND;INT;INT;STRUCT;INT;INT;INT;INT;ENDSTRUCT"
Local $PDATA = DllStructCreate($TAG_APPBARDATA)
DllStructSetData($PDATA, 1, DllStructGetSize($PDATA))
DllStructSetData($PDATA, 2, WinGetHandle("[CLASS:Shell_TrayWnd]", ""))
Local $ARESULT = DllCall("Shell32.dll", "BOOL", "SHAppBarMessage", "DWORD", $ABM_GETTASKBARPOS, "ptr", DllStructGetPtr($PDATA))
If @error Then Return SetError(@error, 0, -1)
If Not $ARESULT[0] Then Return SetError($ARESULT[0], 0, -2)
Return $_POSITIONS[DllStructGetData($PDATA, 4)]
EndFunc
有没有办法将它转换为 Powershell,或者如果这不可能,我如何再次使用 powershell 提取例如“&$SUPERBARPOS[1]&”? 更具体地说,我想在 powershell 中编写一个命令,然后使用该 AutoIT 脚本在 powershell 中查看打印的结果。
从 Powershell one 调用 Autoit 脚本
这是最简单的选项。
PowerShell 允许通过函数调用运算符 &
后跟程序路径及其参数来执行任意程序:
& "c:\path\to\program.exe" "parameter1" "parameter2" "parameter3"
所以在 AutoIT 的情况下 运行 您需要编写一个脚本:
在 64 位系统上:
& "${env:ProgramFiles(x86)}\AutoIt3\AutoIt3.exe" "/AutoIt3ExecuteScript" "c:\your_script.au3"
在 32 位系统上:
& "${env:ProgramFiles}\AutoIt3\AutoIt3.exe" "/AutoIt3ExecuteScript" "c:\your_script.au3"
${env:ProgramFiles(x86)}
替换具有 Program files (x86)
文件夹完整路径的环境变量,很可能是 c:\Program files (x86)
AutoIt3.exe
是实际执行未编译的 autoit 脚本(au3
文本文件)的程序。 /AutoIt3ExecuteScript
告诉它作为脚本执行下一个参数,但通常可以省略。
通过文件将数据从 AutoIT 传递到 PowerShell
有很多方法可以将数据从一个脚本传递到另一个脚本,但是对新手最友好的方法似乎是将数据存储在一个临时文本文件中,尽管它有点低效。
在 AutoIT 脚本中,将以 MSGBOX
开头的行替换为:
FileDelete("c:\myfile.txt")
FileWrite("c:\myfile.txt", $SUPERBARPOS[1])
如果文件已经存在,第一行删除文件 - 否则将追加。
第二行将$SUPERBARPOS[1]
的内容写入文件。
脚本完成后,您可以用记事本打开文件,查看是否包含您想要的文件。
在 Powershell 中读取文件也很容易:
$myvar = [IO.File]::ReadAllText("c:\myfile.txt")
这会将整个文件的内容复制到名为 $myvar
传递数据而不创建文件
当然,用临时文件乱丢硬盘并不是最好的主意。
在按顺序执行的程序之间传递数据的一种好方法是管道,最显着的是 STDIN 和 STDOUT。
为此:
- 将 AutoIT 脚本编译为控制台应用程序(参见
Autoit2exe
命令行文档 and/or#AutoIt3Wrapper_Change2CUI=y
编辑指令 ) - 用类似的东西替换
MSGBOX
行ConsoleWrite($SUPERBARPOS[1] & @CRLF)
或类似的。 这应该将变量作为文本转储到控制台 window 默认情况下(你不会看到它,除非你 运行 你的脚本来自 命令行或 powershell window) 要将文本重定向到变量中,只需调用您的 像这样的脚本:
$myvar = & c:\your_script.exe
如果需要传递多个变量,则需要在 PowerShell 端将它们分开。为此,您可能需要执行以下操作:
$a = $myvar -split "`r`n"
将脚本转换为 PowerShell
因为 AutoIT 和 PowerShell 是两种完全不同的语言,所以没有自动转换工具。要翻译代码,您需要了解 AutoIT 代码并在 PowerShell 中手动编写类似代码。为此,您显然需要充分了解 AutoIT 和 PowerShell 语言。
据我所知,这个脚本基本上调用了几个 WinAPI DLL 函数。 DllCall(). PowerShell appears to allow this with Add-Type.
中很好地描述了流程的 autoit 方面如果您 运行 在进行转换时遇到障碍,请提出更具体的问题。