Вызов скрипта PowerShell из макроса Excel

Вызов скрипта PowerShell из макроса Excel

Я пытаюсь вызвать скрипт PowerShell из макроса в Excel.

Я видел ряд примеров такого рода:

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

Есть второй способ сделать это. Он используетExecМетод Windows Script Host.

У него есть большое преимущество в том, что он можетсчитывать значенияиз вашего внешнего 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

введите описание изображения здесь

Предостережения

  • В отличие от метода 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 этой ветки в коде отсутствует закрывающая скобка. Отсюда и ошибка «Ожидалось: разделитель списка или )" ».
В ответе, который использует x=SHELL(, попробуйте одно из двух. 1) удалите пробелы перед и после &. 2) Вместо использования & попробуйте использовать +

решение4

используйте полный путь PowerShell вместо просто POWERSHELL.EXE, для меня полный путь C:\Windows\syswow64\WindowsPowerShell\v1.0\PowerShell.exe

Связанный контент