从 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方法无法隐藏命令行窗口
  • 当我使用循环时,我无法获得稳定的结果微软的 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 部分中,代码缺少右括号。因此出现错误“应为:列表分隔符或 )” 。
在使用 x=SHELL( 的答案中,请尝试以下两种方法之一。1) 删除 & 前后的空格。2) 不要使用 &,而尝试使用 +

答案4

使用 PowerShell 完整路径而不是 POWERSHELL.EXE,对我来说,完整路径是 C:\Windows\syswow64\WindowsPowerShell\v1.0\PowerShell.exe

相关内容