3

Я пытаюсь вызвать сценарий 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(), любая помощь будет принята с благодарностью.

3 ответа3

6

Есть второй способ сделать это. Он использует метод 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, чтобы проверить, не завершен ли инструмент внешней командной строки

Использованные ресурсы

0

В части OP этого потока в коде отсутствует закрывающая скобка. Отсюда ошибка «Ожидается: разделитель списка или)».
В ответе, который использует x = SHELL(, попробуйте одну из двух вещей. 1) уберите пробелы спереди и сзади &. 2) Вместо использования &, попробуйте использовать +

0

Попробуйте использовать это вместо 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .