Llame al script de PowerShell desde la macro de Excel

Llame al script de PowerShell desde la macro de Excel

Estoy intentando llamar a un script de PowerShell desde una macro en Excel.

He visto varios ejemplos como:

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

Sin embargo, cuando intento usar esto:

Sub Connect_01()  
  Dim x
  x = Shell(“powershell.exe ""\\corp\hdq\Path with spaces\PowerShell\Modules\macro01.ps1""", 1)  
End Sub  

Recibo un error del compilador: Syntax error
si elimino la tarea, aparece el error en el primer par de comillas:
Expected: list separator or )"

Como no tengo mucha experiencia con VBA y ninguna con el comando Shell(), agradecería cualquier ayuda.

Respuesta1

Hay una segunda manera de hacer esto. UsaExecMétodo de Windows Script Host.

Tiene la gran ventaja de que puedevolver a leer los valoresdesde su PowerShell externo, línea de comando o cualquier otra herramienta de línea de comando que tenga. Entonces tienes una comunicación bidireccional entre Excel y Powershell.

macro de 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

Otros ejemplos de trabajo para un comando podrían ser

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

Mi archivo de PowerShell My PS File.ps1para demostrar fue

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

Puede hacer todas las cosas complejas en PowerShell siempre que obtenga echolos resultados desde su archivo de PowerShell o herramienta de línea de comandos. Esto significa que escribes aSalida estándar(salida estándar). Una vez finalizado el script, Excel lee todos los valores conWshShellExec.StdOut.ReadAll

Para garantizar que las rutas con espacios se pasen correctamente de Excel a PowerShell, rodee la ruta con cuatro comillas dobles."powershell -file ""C:\my path\"" "

Resultado en Excel

ingrese la descripción de la imagen aquí

Advertencias

  • Al contrario del método Wscripts Run, el Execmétodo no puede ocultar la ventana de línea de comando
  • No pude obtener resultados estables cuando usé un bucle comomostrado en el artículo de MSDN de Microsoftpara comprobar si la herramienta de línea de comando externa estaba terminada

Recursos usados

Respuesta2

Intente usar esto en lugar de 1. No estoy seguro de dónde viene el 1.

Sub Connect_01()
Dim x as Variant
x = Shell("POWERSHELL.EXE " & "\\corp\hdq\Path with space\PowerShell\Modules\macro01.ps1", vbNormalFocus)
End Sub

O excluirlo todo junto.

Sub Connect_01()
Dim x
x = Shell("POWERSHELL.EXE " & "\\corp\hdq\Path with space\PowerShell\Modules\macro01.ps1")
End Sub

Respuesta3

En la parte OP de este hilo, al código le falta un paréntesis de cierre. De ahí el error, 'Esperado: separador de lista o )" '.
En la respuesta que usa x=SHELL(, intente una de dos cosas. 1) elimine los espacios delante y detrás de &. 2) En lugar de usar &, intente usar +

Respuesta4

use la ruta completa de PowerShell en lugar solo de POWERSHELL.EXE; para mí, la ruta completa es C:\Windows\syswow64\WindowsPowerShell\v1.0\PowerShell.exe

información relacionada