Saltar al contenido

Cómo ejecutar un archivo EXE en PowerShell con parámetros con espacios y comillas

septiembre 29, 2021
apple touch icon@2

Cuando PowerShell ve un comando que comienza con una cadena, simplemente evalúa la cadena, es decir, normalmente lo refleja en la pantalla, por ejemplo:

PS> "Hello World"
Hello World

Si desea que PowerShell interprete la cadena como un nombre de comando, use el operador de llamada (&) así:

PS> & 'C:Program FilesIISMicrosoft Web Deploymsdeploy.exe'

Después de eso, probablemente solo necesite citar pares de parámetros / argumentos que contengan espacios y / o caracteres de comillas. Cuando invoca un archivo EXE como este con argumentos de línea de comando complejos, generalmente es muy útil tener una herramienta que le muestre cómo PowerShell envía los argumentos al archivo EXE. los Extensiones de la comunidad de PowerShell tiene tal herramienta. Se llama echoargs. Simplemente reemplace el archivo EXE con echoargs, dejando todos los argumentos en su lugar, y le mostrará cómo el archivo EXE recibirá los argumentos, por ejemplo:

PS> echoargs -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data>
Arg 2 is <Source=mysource;Integrated>
Arg 3 is <Security=false;User>
Arg 4 is <ID=sa;Pwd=sapass!;Database=mydb;>
Arg 5 is <-dest:dbfullsql=Data>
Arg 6 is <Source=.mydestsource;Integrated>
Arg 7 is <Security=false;User>
Arg 8 is <ID=sa;Pwd=sapass!;Database=mydb; computername=10.10.10.10 username=administrator password=adminpass>

Usando echoargs puedes experimentar hasta que lo hagas bien, por ejemplo:

PS> echoargs -verb:sync "-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;"
Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;>

Resulta que antes me estaba esforzando demasiado para mantener las comillas dobles alrededor de la cadena de conexión. Aparentemente, eso no es necesario porque incluso cmd.exe los eliminará.

Por cierto, felicitaciones al equipo de PowerShell. Fueron muy útiles al mostrarme el encantamiento específico de las comillas simples y dobles para obtener el resultado deseado, si necesita mantener las comillas dobles internas en su lugar. 🙂 También se dan cuenta de que esta es un área de dolor, pero son impulsados ​​por la cantidad de personas que se ven afectadas por un problema en particular. Si esta es un área de dolor para usted, vote a favor de esto Envío de errores de PowerShell.

Para obtener más información sobre cómo analiza PowerShell, consulte mi Serie de blogs de PowerShell eficaz – específicamente elemento 10: «Comprensión de los modos de análisis de PowerShell»

ACTUALIZACIÓN 4/4/2012: Esta situación se vuelve mucho más fácil de manejar en PowerShell V3. Mira esto entrada de blog para más detalles.

close