我怎样才能从运行的PowerShell脚本的AutoIt

问题描述 投票:-1回答:1

我有这样的脚本:

#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中,或者如果这是不可能的,我怎么可以提取例如“&$ SUPERBARPOS [1]”使用,同样,PowerShell的?更具体的,我想要写在PowerShell的命令,看看使用AutoIt脚本在PowerShell中打印的结果。

powershell autoit
1个回答
1
投票

从Powershell的一个调用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。

要做到这一点:

  1. 编译AutoIt脚本作为控制台应用程序(见Autoit2exe命令行的文档和/或编辑器#AutoIt3Wrapper_Change2CUI=y指令)
  2. 像下面这样替换MSGBOX或类似的ConsoleWrite($SUPERBARPOS[1] & @CRLF)线。这应该转储可变文本到系统默认的控制台窗口(你不会看到它,除非你从一个命令行或PowerShell窗口运行脚本)
  3. 要重定向文成变量,而不是,只需调用你的脚本是这样的: $myvar = & c:\your_script.exe
  4. 如果您需要传递多个变量,你需要将它们在PowerShell的侧分开。要做到这一点,你可能想要做的事,如: $a = $myvar -split "`r`n"

转换脚本的PowerShell

由于AutoIt的和PowerShell是两个完全不同的语言,有没有自动转换工具。要翻译,你需要了解AutoIt的代码,并在PowerShell中手工编写类似的代码。要做到这一点,你显然需要知道这两个AutoIt的和PowerShell语言不够好。

据我所知,这个脚本基本上调用几个WinAPI的DLL功能。过程的AutoIt的一侧在DllCall()相当很好的描述。 PowerShell的出现与Add-Type允许这样。

如果你碰到一个障碍做了转换,请向一个更具体的问题。

© www.soinside.com 2019 - 2024. All rights reserved.