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 verwendetExec
Methode 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.ps1
zur Demonstration war
echo "Hello World"
$x = 1 + 1
echo $x
Sie können alle komplexen Dinge in PowerShell tun, solange Sie echo
Ihre 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
Vorbehalte
- Im Gegensatz zur Wscripts-
Run
Methode kann dieExec
Methode 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