題 從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()命令的任何經驗,所以我們將不勝感激。


3
2018-03-05 13:39


起源


在您的示例中,PowerShell.exe之前的第一個雙引號不是常規雙引號,它是左手“Smartquote”。用普通的雙引號替換它,看看是否有幫助。 - Ƭᴇcʜιᴇ007


答案:


還有第二種方法可以做到這一點。它用 Windows腳本宿主 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"

我的PowerShell文件 My PS File.ps1 證明是

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

只要你,你就可以在PowerShell中完成所有復雜的事情 echo 您的PowerShell文件或命令行工具中的結果。這意味著你寫信給 的StdOut (標準輸出)。 腳本完成後,Excel將讀入所有值 WshShellExec.StdOut.ReadAll

要確保帶有空格的路徑從Excel正確傳遞到PowerShell,請使用四個雙引號括起路徑 "powershell -file ""C:\my path\"" "

Excel中的結果

enter image description here

注意事項

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

使用過的資源


6
2017-08-29 10:10





嘗試使用此代替 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

0
2018-03-05 13:54



謝謝回复。執行,但.ps1不運行。控制台閃爍太快,無法讀取錯誤消息,因此我從cmd運行命令。我收到錯誤:“術語'\\ corp \ hdq \ Path'未被識別為cmdlet,函數,腳本文件或可操作程序的名稱。” - Number8
有沒有辦法讓控制台上顯示錯誤? - Number8
我在引用外部文件時遇到了類似的情況,並且只需將具有空間的路徑映射到具有NET USE的驅動器,然後在腳本結束時將其刪除。你有一個有趣的場景,因為你的powershell腳本本身就在這樣的路徑上,所以你可以先在Excel宏中映​​射它。您也可以通過在調用macro01.ps1文件的末尾添加諸如&“>〜\ Desktop \ macroOutput.txt”之類的內容來保存從宏運行時發生的輸出。讓我們知道它是如何工作的! - Bradley Forney
@ Bradley Forney - 你能更明確地捕捉輸出嗎?那是在Shell()調用之後,還是部分命令傳遞給Shell()?我的第一次嘗試沒有抓到...... - Number8
該 1 只是窗口樣式背後的數值 vbNormalFocus - nixda


在該線程的OP部分中,代碼缺少右括號。因此錯誤,'預期:列表分隔符或)''。
在使用x = SHELL的答案中(嘗試兩件事之一.1)刪除前後空格&。 2)而不是使用&,嘗試使用+


0
2018-03-19 01:39



你能在答案中寫出代碼snippit,顯示正確的代碼。我無法理解你現在是怎麼寫的。 - djsmiley2k