PowerShell-Skript aus Excel-Makro aufrufen

PowerShell-Skript aus Excel-Makro aufrufen

Ich versuche, ein PowerShell-Skript aus einem Makro in Excel aufzurufen.

Ich habe eine Reihe von Beispielen gesehen, etwa wie folgt:

retval = Shell("powershell ""C:\MyTest.ps1""", 1)

Wenn ich versuche, dies zu verwenden, geschieht jedoch:

Sub Connect_01()  
  Dim x
  x = Shell(“powershell.exe ""\\corp\hdq\Path with spaces\PowerShell\Modules\macro01.ps1""", 1)  
End Sub  

Ich erhalte einen Compilerfehler: Syntax error
Wenn ich die Zuweisung entferne, erhalte ich den Fehler beim ersten Anführungszeichenpaar:
Expected: list separator or )"

Da ich nicht viel Erfahrung mit VBA und keine mit dem Shell()-Befehl habe, wäre ich für jede Hilfe dankbar.

Antwort1

Es gibt noch eine zweite Möglichkeit, dies zu tun. Sie verwendetExecMethode des Windows Script Hosts.

Es hat den großen Vorteil, dass esWerte zurücklesenvon Ihrer externen PowerShell, der Befehlszeile oder einem anderen Befehlszeilentool, das Sie haben. Sie haben also eine bidirektionale Kommunikation zwischen Excel und PowerShell.

Excel-Makro

Sub RunAndGetCmd()

    strCommand = "Powershell -File ""C:\path\to\My PS File.ps1"""
    Set WshShell = CreateObject("WScript.Shell")
    Set WshShellExec = WshShell.Exec(strCommand)
    strOutput = WshShellExec.StdOut.ReadAll
    Msgbox strOutput

End Sub

Andere funktionierende Beispiele für einen Befehl könnten sein:

  • strCommand = "ping.exe 127.0.0.1"
  • strCommand = "Powershell Echo Hello World"

Meine PowerShell-Datei My PS File.ps1zur Demonstration war

echo "Hello World"
$x = 1 + 1
echo $x

Sie können alle komplexen Dinge in PowerShell tun, solange Sie echoIhre Ergebnisse aus Ihrer PowerShell-Datei oder Ihrem Befehlszeilentool heraus erhalten. Das bedeutet, dass Sie inStdOut(Standardausgabe). Nach Abschluss des Skripts liest Excel alle Werte mitWshShellExec.StdOut.ReadAll

Um sicherzustellen, dass Pfade mit Leerzeichen ordnungsgemäß von Excel an PowerShell übergeben werden, schließen Sie den Pfad in vier doppelte Anführungszeichen ein."powershell -file ""C:\my path\"" "

Ergebnis in Excel

Bildbeschreibung hier eingeben

Vorbehalte

  • Im Gegensatz zur Wscripts- RunMethode kann die ExecMethode das Befehlszeilenfenster nicht ausblenden
  • Ich konnte keine stabilen Ergebnisse erzielen, wenn ich eine Schleife alsgezeigt im MSDN-Artikel von Microsoftum zu prüfen, ob das externe Kommandozeilentool fertig ist

Verwendete Ressourcen

Antwort2

Versuchen Sie dies anstelle von zu verwenden 1. Ich bin mir nicht sicher, woher die 1 kommt -

Sub Connect_01()
Dim x as Variant
x = Shell("POWERSHELL.EXE " & "\\corp\hdq\Path with space\PowerShell\Modules\macro01.ps1", vbNormalFocus)
End Sub

Oder ganz ausschließen -

Sub Connect_01()
Dim x
x = Shell("POWERSHELL.EXE " & "\\corp\hdq\Path with space\PowerShell\Modules\macro01.ps1")
End Sub

Antwort3

Im OP-Teil dieses Threads fehlt dem Code eine schließende Klammer. Daher der Fehler „Erwartet: Listentrennzeichen oder )"“.
Versuchen Sie in der Antwort, die x=SHELL( verwendet, eines von zwei Dingen. 1) Entfernen Sie die Leerzeichen vor und hinter &. 2) Verwenden Sie statt & stattdessen +

Antwort4

verwenden Sie den vollständigen PowerShell-Pfad statt nur POWERSHELL.EXE. Bei mir lautet der vollständige Pfad C:\Windows\syswow64\WindowsPowerShell\v1.0\PowerShell.exe

verwandte Informationen