Chame o script do PowerShell da macro do Excel

Chame o script do PowerShell da macro do Excel

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 usaExecMé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.ps1para demonstrar foi

echo "Hello World"
$x = 1 + 1
echo $x

Você pode fazer todas as coisas complexas no PowerShell, desde que obtenha echoos 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

insira a descrição da imagem aqui

Ressalvas

  • Ao contrário do método Wscripts Run, o Execmé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

informação relacionada