280 votos

Cómo ejecutar exe en powerhell con parámetros con espacios y comillas

¿Cómo se ejecuta este comando en Powershell?

C:\Program Archivos \IIS\Microsoft Despliegue en la web \msdeploy.exe -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=. \mydestsource ;Seguridad integrada=falso;ID de usuario=sa;Pwd=sapass!;Base de datos=mydb;",nombre de ordenador=10.10.10.10,nombre de usuario=administrador,contraseña=adminpass"

297voto

Keith Hill Puntos 73162

Cuando PowerShell ve un comando que comienza con una cadena, sólo evalúa la cadena, es decir, típicamente la repite en la pantalla, por ejemplo:

PS> "Hello World"
Hello World

Si quieres que PowerShell interprete la cadena como un nombre de comando entonces usa el operador de llamadas (&) así:

PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'

Después de eso, probablemente sólo necesites citar los pares de parámetros/grandes que contienen espacios y/o caracteres de cita. Cuando invoca un exe como este con argumentos complejos de línea de comandos suele ser muy útil tener una herramienta que le muestre cómo PowerShell envía los argumentos al exe. El Extensiones de la comunidad de PowerShell tiene esa herramienta. Se llama ecoargs. Sólo tienes que reemplazar el exe con ecoargs - dejando todos los argumentos en su lugar y te mostrará cómo el exe recibirá los args, 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 las ecoargs 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 esforzaba mucho por mantener las comillas dobles alrededor de la cadena de conexión. Aparentemente eso no es necesario porque incluso cmd.exe las quitará.

Por cierto, me quito el sombrero ante el equipo de PowerShell. Fueron de gran ayuda al mostrarme el conjuro específico de las comillas simples y dobles para obtener el resultado deseado - si necesitabas mantener las comillas dobles internas en su lugar. :-) También se dan cuenta de que es un área de dolor, pero están impulsados por el número de personas que se ven afectadas por un tema en particular. Si esta es un área de dolor para ti, entonces por favor vota esto Presentación de errores de PowerShell .

Para más información sobre cómo analiza PowerShell, mira mi Serie de blogs de Effective PowerShell - específicamente punto 10 - "Entendiendo los modos de análisis de PowerShell"

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

51voto

nonolde1er Puntos 191

Sólo tienes que añadir el & operador antes del nombre .exe. Aquí hay un comando para instalar Sql Server Express en modo silencioso:

$fileExe = "T:\SQLEXPRADV_x64_ENU.exe"
$CONFIGURATIONFILE = "T:\ConfSetupSql2008Express.ini"

& $fileExe  /CONFIGURATIONFILE=$CONFIGURATIONFILE

17voto

Akira Yamamoto Puntos 982

Esto funcionó para mí:

& 'D:\Server\PSTools\PsExec.exe' @('\\1.1.1.1', '-accepteula', '-d', '-i', $id, '-h', '-u', 'domain\user', '-p', 'password', '-w', 'C:\path\to\the\app', 'java', '-jar', 'app.jar')

Sólo hay que poner caminos o cadenas de conexión en un elemento de la matriz y dividir las otras cosas en un elemento de la matriz cada una.

Hay muchas otras opciones aquí: https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx

Microsoft debería hacer esta forma más simple y compatible con la sintaxis de la línea de comandos.

12voto

Baodad Puntos 175

Vea esta página: http://edgylogic.com/blog/powershell-and-external-commands-done-right/

Resumen usando vshadow como el ejecutable externo:

$exe = "H:\backup\scripts\vshadow.exe"
&$exe -p -script=H:\backup\scripts\vss.cmd E: M: P:

8voto

G-Mac Puntos 366

Pude hacer funcionar mi comando similar usando el siguiente enfoque:

msdeploy.exe -verb=sync "-source=dbFullSql=Server=THESERVER;Database=myDB;UID=sa;Pwd=saPwd" -dest=dbFullSql=c:\temp\test.sql

Para su comando (no es que ayude mucho ahora), las cosas se verían algo así:

msdeploy.exe -verb=sync "-source=dbfullsql=Server=mysource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;" "-dest=dbfullsql=Server=mydestsource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

Los puntos clave son:

  • Usar comillas alrededor del argumento de la fuente, y eliminar las comillas incrustadas alrededor de la cadena de conexión
  • Usar los nombres de claves alternativas para construir la cadena de conexión SQL que no tienen espacios en ellos. Por ejemplo, utilice "UID" en lugar de "User Id", "Server" en lugar de "Data Source", "Trusted_Connection" en lugar de "Integrated Security", etc. Sólo pude hacerlo funcionar una vez que eliminé todos los espacios de la cadena de conexión.

No intenté añadir la parte del "nombre del ordenador" al final de la línea de comandos, pero espero que esta información ayude a otros a leer esto ahora para acercarse a su resultado deseado.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X