從 Excel 巨集呼叫 PowerShell 腳本

從 Excel 巨集呼叫 PowerShell 腳本

我正在嘗試從 Excel 中的巨集呼叫 PowerShell 腳本。

我見過很多這樣的例子:

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

然而,當我嘗試使用它時:

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

我收到編譯器錯誤: Syntax error
如果刪除分配,我會在第一對引號收到錯誤:
Expected: list separator or )"

由於我沒有太多使用 VBA 的經驗,也沒有使用 Shell() 指令的經驗,因此我們將不勝感激。

答案1

還有第二種方法可以做到這一點。它用Windows Script Host 的Exec方法

它有一個很大的優點就是可以讀回值從外部 PowerShell、命令列或您擁有的任何其他命令列工具。這樣您就可以在 Excel 和 Powershell 之間進行雙向通訊。

Excel巨集

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

命令的其他工作範例可能是

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

My PS File.ps1我要示範的PowerShell 檔案是

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

只要您echo從 PowerShell 檔案或命令列工具中獲得結果,就可以在 PowerShell 中執行所有複雜的操作。這意味著您寫信給標準輸出(標準輸出)。腳本完成後,Excel 會讀取所有值WshShellExec.StdOut.ReadAll

為了確保帶有空格的路徑正確地從 Excel 傳遞到 PowerShell,請用四個雙引號將該路徑引起來"powershell -file ""C:\my path\"" "

Excel 中的結果

在此輸入影像描述

注意事項

  • 與WscriptsRun方法相反,該Exec方法無法隱藏命令列窗口
  • 當我使用循環時,我無法獲得穩定的結果Microsoft 的 MSDN 文章中顯示檢查外部命令列工具是否已完成

使用的資源

答案2

嘗試使用這個而不是1.不確定 1 來自哪裡 -

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

或將其全部排除 -

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

答案3

在此線程的 OP 部分中,程式碼缺少右括號。
因此,出現錯誤「預期:列表分隔符號或)」'。

答案4

使用PowerShell完整路徑而不是POWERSHELL.EXE,對我來說,完整路徑是C:\Windows\syswow64\WindowsPowerShell\v1.0\PowerShell.exe

相關內容