我正在尝试从 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
方法无法隐藏命令行窗口 - 当我使用循环时,我无法获得稳定的结果微软的 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