Как запустить сценарии AutoIT из powershell - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть этот скрипт:

#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 и увидеть результат, напечатанный в powershell, с использованием этого сценария AutoIT.

1 Ответ

0 голосов
/ 13 ноября 2018

Вызов скрипта Autoit из Powershell one

Это самый простой вариант.

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.

Насколько я могу судить, этот скрипт в основном вызывает несколько функций DLL WinAPI. Автоматическая сторона процесса довольно хорошо описана в DllCall () . PowerShell позволяет это сделать с помощью Add-Type .

Если вы когда-либо сталкиваетесь с препятствиями во время преобразования, задайте более конкретный вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...