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. UsaExec
Mé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.ps1
para demostrar fue
echo "Hello World"
$x = 1 + 1
echo $x
Puede hacer todas las cosas complejas en PowerShell siempre que obtenga echo
los 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
Advertencias
- Al contrario del método Wscripts
Run
, elExec
mé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