Chame o script PowerShell da macro do Excel

3

Estou tentando chamar um script do PowerShell de uma macro no Excel.

Eu tenho visto vários exemplos ao longo das linhas:

retval = Shell("powershell ""C:\MyTest.ps1""", 1)

Quando eu 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  

Eu recebo um erro do compilador: Syntax error
Se eu remover a tarefa, recebo o erro no primeiro par de aspas:
Expected: list separator or )"

Como não tenho muita experiência com o VBA e nenhum com o comando Shell (), qualquer ajuda seria bem-vinda.

    
por Number8 05.03.2014 / 14:39

3 respostas

6

Existe uma segunda maneira de fazer isso. Ele usa método Exec do host de scripts do Windows .

Ele tem a grande vantagem de poder ler os valores de 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 o Excel e o 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 podem ser

  • strCommand = "ping.exe 127.0.0.1"
  • strCommand = "Powershell Echo Hello World"

Meu arquivo do 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 contanto que você use echo dos resultados de dentro do seu arquivo do PowerShell ou da ferramenta de linha de comando. Isso significa que você escreve para StdOut (saída padrão). Após o script terminar, o Excel lê todos os valores com WshShellExec.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

Advertências

  • AocontráriodométodoWscriptsRun,ométodoExecnãopodeocultarajaneladalinhadecomando
  • Nãoconseguiresultadosestáveisquandouseiumloopcomo mostrado no artigo do MSDN da Microsoft para verificar se a ferramenta de linha de comando externa foi concluída

Recursos usados

por 29.08.2015 / 12:10
0

Tente usar isso em vez de 1 . Não tenho certeza de onde o 1 vem -

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
    
por 05.03.2014 / 14:54
0

Na parte OP deste encadeamento, o código não possui um parêntese de fechamento. Daí o erro, 'esperado: separador de lista ou) "'. Na resposta que usa x = SHELL (, tente uma das duas coisas: 1) remova os espaços na frente e atrás &. 2) Em vez de usar & tente usar +

    
por 19.03.2017 / 02:39