Estou tentando chamar um script do PowerShell a partir de uma macro no Excel.
Já vi vários exemplos do tipo:
retval = Shell("powershell ""C:\MyTest.ps1""", 1)
Quando tento usar isso, no entanto:
Sub Connect_01()
Dim x
x = Shell(“powershell.exe ""\\corp\hdq\Path with spaces\PowerShell\Modules\macro01.ps1""", 1)
End Sub
Recebo um erro do compilador: Syntax error
se eu remover a atribuição, recebo o erro no primeiro par de aspas:
Expected: list separator or )"
Como não tenho muita experiência com VBA e nenhuma com o comando Shell(), qualquer ajuda seria apreciada.
Responder1
Existe uma segunda maneira de fazer isso. Ele usaExec
Método do Windows Script Host.
Tem a grande vantagem de poderler novamente os valoresdo seu PowerShell externo, linha de comando ou qualquer outra ferramenta de linha de comando que você tenha. Então você tem uma comunicação bidirecional entre Excel e Powershell.
Macro do 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
Outros exemplos de trabalho para um comando poderiam ser
strCommand = "ping.exe 127.0.0.1"
strCommand = "Powershell Echo Hello World"
Meu arquivo PowerShell My PS File.ps1
para demonstrar foi
echo "Hello World"
$x = 1 + 1
echo $x
Você pode fazer todas as coisas complexas no PowerShell, desde que obtenha echo
os resultados no arquivo do PowerShell ou na ferramenta de linha de comando. Isso significa que você escreve paraSaída padrão(saída padrão). Após a conclusão do script, o Excel lê todos os valores comWshShellExec.StdOut.ReadAll
Para garantir que os caminhos com espaços sejam passados corretamente do Excel para o PowerShell, coloque o caminho entre quatro aspas duplas"powershell -file ""C:\my path\"" "
Resultado no Excel
Ressalvas
- Ao contrário do método Wscripts
Run
, oExec
método não pode ocultar a janela da linha de comando - Não consegui obter resultados estáveis quando usei um loop comomostrado no artigo MSDN da Microsoftpara verificar se a ferramenta de linha de comando externa foi concluída
Recursos usados
Responder2
Tente usar isso em vez de 1
. Não tenho certeza de onde vem o 1 -
Sub Connect_01()
Dim x as Variant
x = Shell("POWERSHELL.EXE " & "\\corp\hdq\Path with space\PowerShell\Modules\macro01.ps1", vbNormalFocus)
End Sub
Ou exclua tudo junto -
Sub Connect_01()
Dim x
x = Shell("POWERSHELL.EXE " & "\\corp\hdq\Path with space\PowerShell\Modules\macro01.ps1")
End Sub
Responder3
Na parte OP deste tópico, falta um parêntese de fechamento no código. Daí o erro, 'Esperado: separador de lista ou )" '.
Na resposta que usa x=SHELL(, tente uma de duas coisas. 1) remova os espaços na frente e atrás de &. 2) Em vez de usar &, tente usar +
Responder4
use o caminho completo do PowerShell em vez de apenas POWERSHELL.EXE, para mim, o caminho completo é C:\Windows\syswow64\WindowsPowerShell\v1.0\PowerShell.exe