web-dev-qa-db-fra.com

Exécutez la fonction PowerShell à partir de Python

J'ai besoin d'exécuter une fonction PowerShell à partir d'un script Python. Les fichiers .ps1 et .py vivent actuellement dans le même répertoire. Les fonctions que je veux appeler se trouvent dans le script PowerShell . La plupart des réponses que j'ai vues concernent l'exécution de scripts PowerShell entiers à partir de Python. Dans ce cas, j'essaie d'exécuter une fonction individuelle dans un script PowerShell à partir d'un script Python.

Voici l'exemple de script PowerShell:

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

Function bye
{
    Write-Host "Goodbye"
}

Write-Host "PowerShell sample says hello."

et le script Python:

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)

Donc, d'une manière ou d'une autre, je veux exécuter la fonction 'hello ()' ou 'bye ()' qui se trouve dans l'exemple PowerShell. Il serait également agréable de savoir comment passer des paramètres à la fonction. Merci!

25
H_H

Vous voulez deux choses: dot source le script (qui est (autant que je sache) similaire à l'importation de python), et subprocess.call .

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

donc, ce qui se passe ici, c'est que nous démarrons PowerShell, lui disons d'importer votre script et d'utiliser un point-virgule pour terminer cette instruction. Ensuite, nous pouvons exécuter plus de commandes, à savoir bonjour.

Vous souhaitez également ajouter des paramètres aux fonctions, utilisons donc celui de l'article ci-dessus (légèrement modifié):

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

puis appelez la fonction avec le paramètre souhaité, tant que PowerShell peut gérer cette entrée. Nous allons donc modifier ce qui précède python pour:

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

cela me donne la sortie:

PowerShell sample says hello.
11
35
Adam R. Grey