簡體   English   中英

如何從 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 調用 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. ConsoleWrite($SUPERBARPOS[1] & @CRLF)或類似的東西替換MSGBOX行。 默認情況下,這應該將變量作為文本轉儲到控制台窗口(除非您從命令行或 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進行此操作。

如果您在轉換時遇到障礙,請提出更具體的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM