Я пытаюсь вызвать скрипт 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