我有这个脚本:
#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。
要做到这一点:
- 将AutoIT脚本编译为控制台应用程序(请参阅
Autoit2exe
命令行文档和/或#AutoIt3Wrapper_Change2CUI=y
编辑器指令( - 用类似的东西替换
MSGBOX
行CCD_ 14或类似物。这应该将变量作为文本转储到控制台窗口默认情况下(除非从命令行或powershell窗口( 要将文本重定向到变量中,只需调用脚本如下:
$myvar = & c:your_script.exe
如果需要传递多个变量,则需要在PowerShell端将它们分开。要做到这一点,你可能想做一些类似的事情:
$a = $myvar -split "`r`n"
将脚本转换为PowerShell
因为AutoIT和PowerShell是两种完全不同的语言,所以没有自动转换工具。要翻译代码,您需要理解AutoIT代码,并在PowerShell中手动编写类似的代码。要做到这一点,您显然需要充分了解AutoIT和PowerShell语言。
据我所知,这个脚本基本上调用了几个WinAPI DLL函数。进程的自动端在DllCall((中有很好的描述。PowerShell似乎允许使用Add Type进行此操作。
如果你在转换时遇到了障碍,请问一个更具体的问题。