我正在嘗試從 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 中的結果
注意事項
- 與Wscripts
Run
方法相反,該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