如何从powershell运行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:pathtoprogram.exe" "parameter1" "parameter2" "parameter3"

因此,在AutoIT运行脚本的情况下,您需要编写:

在64位系统上:

& "${env:ProgramFiles(x86)}AutoIt3AutoIt3.exe" "/AutoIt3ExecuteScript" "c:your_script.au3"

在32位系统上:

& "${env:ProgramFiles}AutoIt3AutoIt3.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。

要做到这一点:

  1. 将AutoIT脚本编译为控制台应用程序(请参阅Autoit2exe命令行文档和/或#AutoIt3Wrapper_Change2CUI=y编辑器指令(
  2. 用类似的东西替换MSGBOX行CCD_ 14或类似物。这应该将变量作为文本转储到控制台窗口默认情况下(除非从命令行或powershell窗口(
  3. 要将文本重定向到变量中,只需调用脚本如下:

    $myvar = & c:your_script.exe
    
  4. 如果需要传递多个变量,则需要在PowerShell端将它们分开。要做到这一点,你可能想做一些类似的事情:

    $a = $myvar -split "`r`n"
    

将脚本转换为PowerShell

因为AutoIT和PowerShell是两种完全不同的语言,所以没有自动转换工具。要翻译代码,您需要理解AutoIT代码,并在PowerShell中手动编写类似的代码。要做到这一点,您显然需要充分了解AutoIT和PowerShell语言。

据我所知,这个脚本基本上调用了几个WinAPI DLL函数。进程的自动端在DllCall((中有很好的描述。PowerShell似乎允许使用Add Type进行此操作。

如果你在转换时遇到了障碍,请问一个更具体的问题。

最新更新