Подтвердить что ты не робот

Запустите функцию PowerShell из Python script

Мне нужно запустить функцию PowerShell с Python script. Файлы .ps1 и .py в настоящее время находятся в одном каталоге. Функции, которые я хочу вызвать, находятся в PowerShell script. Большинство ответов, которые я видел, предназначены для запуска всех сценариев PowerShell с Python. В этом случае я пытаюсь запустить отдельную функцию в PowerShell script из Python script.

Вот пример PowerShell script:

# sample PowerShell
Function hello
{
    Write-Host "Hi from the hello function : )"
}

Function bye
{
    Write-Host "Goodbye"
}

Write-Host "PowerShell sample says hello."

и Python script:

import argparse
import subprocess as sp

parser = argparse.ArgumentParser(description='Sample call to PowerShell function from Python')
parser.add_argument('--functionToCall', metavar='-f', default='hello', help='Specify function to run')

args = parser.parse_args()

psResult = sp.Popen([r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe',
'-ExecutionPolicy',
'Unrestricted',
'. ./samplePowerShell',
args.functionToCall],
stdout = sp.PIPE,
stderr = sp.PIPE)

output, error = psResult.communicate()
rc = psResult.returncode

print "Return code given to Python script is: " + str(rc)
print "\n\nstdout:\n\n" + str(output)
print "\n\nstderr: " + str(error)

Итак, так или иначе, я хочу запустить функцию hello() 'или' bye() ', которая находится в образце PowerShell. Также было бы неплохо узнать, как передать параметры функции. Спасибо!

4b9b3361

Ответ 1

Вы хотите две вещи: dot source script (который, насколько я знаю, похож на импорт python), и subprocess.call.

import subprocess
subprocess.call(["C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", ". \"./SamplePowershell\";", "&hello"])

так что здесь происходит, что мы запускаем powershell, скажем ему импортировать ваш script и использовать точку с запятой, чтобы закончить этот оператор. Затем мы можем выполнить больше команд, а именно, привет.

Вы также хотите добавить параметры к функциям, поэтому используйте один из приведенных выше статей (слегка измененный):

Function addOne($intIN)
{
    Write-Host ($intIN + 1)
}

а затем вызовите функцию с любым параметром, который вы хотите, до тех пор, как powershell может обрабатывать этот ввод. Поэтому мы изменим приведенный выше python на:

import subprocess
subprocess.call(["C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", ". \"./SamplePowershell\";", "&addOne(10)"])

это дает мне результат:

PowerShell sample says hello.
11