script parametros ejecutar crear con como comandos bat powershell parameters quotes exe spaces

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



ejecutar.bat con powershell (14)

Consulte 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:

¿Cómo ejecutas el siguiente comando en PowerShell?

C: / Archivos de programa / IIS / Microsoft Web Deploy / msdeploy.exe -verb: sync -source: dbfullsql = "Fuente de datos = mysource; Integrated Security = false; ID de usuario = sa; Pwd = sapass!; Database = mydb;" -dest: dbfullsql = "Fuente de datos =. / mydestsource; Seguridad integrada = false; ID de usuario = sa; Pwd = sapass!; Base de datos = mydb;", computername = 10.10.10.10, username = administrador, password = adminpass "


Cuando PowerShell ve un comando que comienza con una cadena, simplemente evalúa la cadena, es decir, normalmente la borra 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 Files/IIS/Microsoft Web Deploy/msdeploy.exe''

Después de eso, es probable que 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 complejos en la línea de comando, generalmente es muy útil tener una herramienta que le muestre cómo PowerShell envía los argumentos al archivo EXE. PowerShell Community Extensions tiene una herramienta de este tipo. Se llama echoargs. Simplemente reemplaza el archivo EXE por echoargs, dejando todos los argumentos en su lugar, y te 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 de gran ayuda para mostrarme el conjuro específico de comillas simples y dobles para obtener el resultado deseado, si fuera necesario mantener las comillas dobles internas en su lugar. :-) También se dan cuenta de que esta es un área de dolor, pero están motivados por la cantidad de personas que se ven afectadas por un problema en particular. Si esta es un área de dolor para usted, entonces vote este envío de errores de PowerShell .

Para obtener más información sobre cómo analiza PowerShell, consulte mi serie de blogs de PowerShell , específicamente el artículo 10, "Descripción de los modos de análisis de PowerShell"

ACTUALIZACIÓN 04/04/2012: Esta situación es mucho más fácil de manejar en PowerShell V3. Vea esta publicación del blog para más detalles .


En caso de que alguien se esté preguntando cómo ejecutar un archivo ejecutable:

.....>. / file.exe

o

......> full / path / to / file.exe


Entonces, me encontré con un problema similar y decidí resolverlo de esta manera:

  1. Escape sus caracteres de comillas (") con una marca de retroceso (`)
  2. Rodea tu nueva expresión con comillas (")
  3. Usando el operador de llamada (&), emita el comando invoke-expression en la nueva cadena

Ejemplo de solución:

& {invocación-expresión "C: / Archivos de programa / IIS / Microsoft Web Deploy / msdeploy.exe -verb: sync -source: dbfullsql =` "Fuente de datos = mysource; Integrated Security = false; ID de usuario = sa; Pwd = sapass !; Database = mydb; `" -dest: dbfullsql = `" Fuente de datos =. / Mydestsource; Integrated Security = false; ID de usuario = sa; Pwd = sapass!; Database = mydb; `", computername = 10.10.10.10, nombre de usuario = administrador, contraseña = adminpass` ""}


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'')

Simplemente coloque rutas o cadenas de conexión en un elemento de la matriz y divida las otras cosas en un elemento de la matriz cada uno.

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

Microsoft debería hacerlo de esta manera más simple y compatible con la sintaxis del símbolo del sistema.


Esto funcionó para mí:

PowerShell.exe -Command "& ""C:/Some Script/Path With Spaces.ps1"""

La clave parece ser que todo el comando está encerrado entre comillas externas, el símbolo "&" se usa para especificar que se está ejecutando otro archivo de comando secundario, luego finalmente se escapan (doble-doble) comillas alrededor de la ruta / nombre de archivo con espacios En ti querías ejecutar en primer lugar.

Esta es también la conclusión de la única solución al problema de la conexión de MS que el archivo no devuelve los códigos de retorno que no son cero y la única opción es Comandante. Pero hasta ahora se pensaba que una limitación de -Command era que no admitía espacios. También he actualizado ese artículo de retroalimentación.

http://connect.microsoft.com/PowerShell/feedback/details/750653/powershell-exe-doesn-t-return-correct-exit-codes-when-using-the-file-option


Hay bastantes métodos que puedes usar para hacerlo.

Existen otros métodos, como usar el Operador de llamadas ( & ), el cmdlet Invoke-Expression, etc. Pero se consideran inseguros. Microsoft recomienda usar Start-Process .

Método 1

Un simple ejemplo

Start-Process -NoNewWindow -FilePath "C:/wamp64/bin/mysql/mysql5.7.19/bin/mysql" -ArgumentList "-u root","-proot","-h localhost"

En tu caso

Start-Process -NoNewWindow -FilePath "C:/Program Files/IIS/Microsoft Web Deploy/msdeploy.exe" -ArgumentList "-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"

En este método, se separan todos y cada uno de los parámetros en ArgumentList usando comas.

Método 2

Ejemplo simple

Start-Process -NoNewWindow -FilePath "C:/wamp64/bin/mysql/mysql5.7.19/bin/mysql" -ArgumentList "-u root -proot -h localhost"

En tu caso

Start-Process -NoNewWindow -FilePath "C:/Program Files/IIS/Microsoft Web Deploy/msdeploy.exe" -ArgumentList "-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"

Este método es más fácil ya que permite escribir sus parámetros de una sola vez.

Tenga en cuenta que en powershell para representar la comilla (") en una cadena , debe insertar el acento grave (`) (Esta es la tecla sobre la tecla Tab del teclado de los Estados Unidos).

-El parámetro NoNewWindow se usa para mostrar el nuevo proceso en la ventana de la consola actual. Por defecto, Windows PowerShell abre una nueva ventana.

Referencias: Powershell/Scripting/Start-Process


Intenté todas las sugerencias, pero aún no msiexec.exe ejecutar msiexec.exe con parámetros que contuvieran espacios. Así que mi solución terminó usando System.Diagnostics.ProcessStartInfo :

# can have spaces here, no problems $settings = @{ CONNECTION_STRING = "... ..." ENTITY_CONTEXT = "... ..." URL = "..." } $settingsJoined = ($settings.Keys | % { "$_=""$($settings[$_])""" }) -join " " $pinfo = New-Object System.Diagnostics.ProcessStartInfo $pinfo.WorkingDirectory = $ScriptDirectory $pinfo.FileName = "msiexec.exe" $pinfo.RedirectStandardError = $true $pinfo.RedirectStandardOutput = $true $pinfo.UseShellExecute = $false $pinfo.Arguments = "/l* install.log /i installer.msi $settingsJoined" $p = New-Object System.Diagnostics.Process $p.StartInfo = $pinfo $p.Start() | Out-Null $p.WaitForExit() $stdout = $p.StandardOutput.ReadToEnd()


Nueva cadena de escape en PowerShell V3, citada en Nuevas características del lenguaje V3 :

Reutilización más fácil de líneas de comando desde cmd.exe

La web está llena de líneas de comando escritas para Cmd.exe. Estas líneas de comandos funcionan con suficiente frecuencia en PowerShell, pero cuando incluyen ciertos caracteres, por ejemplo, un punto y coma (;), un signo de dólar ($) o llaves, debe realizar algunos cambios, probablemente agregando algunas comillas. Esto parecía ser la fuente de muchos dolores de cabeza menores.

Para ayudar a abordar este escenario, agregamos una nueva forma de "escapar" del análisis de las líneas de comando. Si usa un parámetro mágico -%, paramos nuestro análisis normal de su línea de comando y cambiamos a algo mucho más simple. No coincidimos las comillas. No paramos en punto y coma. No expandimos las variables de PowerShell. Expandimos las variables de entorno si usa la sintaxis de Cmd.exe (por ejemplo,% TEMP%). Aparte de eso, los argumentos hasta el final de la línea (o tubería, si está canalizando) se pasan como están. Aquí hay un ejemplo:

PS> echoargs.exe --% %USERNAME%,this=$something{weird} Arg 0 is <jason,this=$something{weird}>


Pude hacer que mi comando similar funcionara 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 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:

  • Use comillas alrededor del argumento fuente y elimine las comillas incrustadas alrededor de la cadena de conexión
  • Utilice los nombres de clave alternativos al crear la cadena de conexión SQL que no tienen espacios en ellos. Por ejemplo, use "UID" en lugar de "Id. De usuario", "Servidor" en lugar de "Fuente de datos", "Conexión de confianza" en lugar de "Seguridad integrada", etc. Solo pude hacerlo funcionar una vez que eliminé todos los espacios de la cadena de conexión.

No intenté agregar la parte de "nombre de computadora" al final de la línea de comando, pero espero que esta información ayude a otros a leer esto ahora a acercarse más al resultado deseado.


Puede ejecutar archivos exe en powershell de diferentes maneras. Por ejemplo, si desea ejecutar unrar.exe y extraer un archivo .rar, simplemente puede escribir en powershell esto:

$extract_path = "C:/Program Files/Containing folder"; $rar_to_extract = "C:/Path_to_arch/file.rar"; #(or.exe if its a big file) C:/Path_here/Unrar.exe x -o+ -c- $rar_to_extract $extract_path;

Pero a veces, esto no funciona, por lo que debe usar el parámetro & como se muestra arriba: por ejemplo, con vboxmanage.exe (una herramienta para administrar máquinas virtuales de caja virtual) debe llamar a los paramterers fuera de la cadena de esta manera, sin comillas:

> $vmname = "misae_unrtes_1234123"; #(name too long, we want to change this) > & ''C:/Program Files/Oracle/VirtualBox/VBoxManage.exe'' modifyvm $vmname --name UBUNTU;

Si desea llamar simplemente a un archivo archivado de winrar como archivos .exe, también puede descomprimirlo con el cmdlet invoke-command y un parámetro silencioso / S (se extraerá en la misma carpeta que cuando se comprimió).

> Invoke-Command -ScriptBlock { C:/Your-path/archivefile.exe /S };

Así que hay varias formas de ejecutar archivos .exe con argumentos en powershell.

A veces, uno debe encontrar una solución para que funcione correctamente, lo que puede requerir un poco más de esfuerzo y dolor :) según la forma en que se haya compilado o creado el archivo .exe a sus creadores.


Simplemente agregue el operador & antes del nombre .exe. Aquí hay un comando para instalar SQL Server Express en modo silencio:

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


Tenía espacios tanto en comando como en parámetros, y esto es lo que me funcionó:

$Command = "E:/X64/Xendesktop Setup/XenDesktopServerSetup.exe" $Parms = "/COMPONENTS CONTROLLER,DESKTOPSTUDIO,DESKTOPDIRECTOR,LICENSESERVER,STOREFRONT /PASSIVE /NOREBOOT /CONFIGURE_FIREWALL /NOSQL" $Prms = $Parms.Split(" ") & "$Command" $Prms

Básicamente es igual a la respuesta de Akira, pero esto funciona si construyes dinámicamente los parámetros de tus comandos y los pones en una variable.


Una respuesta alternativa es usar un interruptor de comando codificado en Base64 :

powershell -EncodedCommand "QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA=="

Cuando se decodifique, verá que es el fragmento original del OP con todos los argumentos y comillas dobles conservados.

powershell.exe -EncodedCommand Accepts a base-64-encoded string version of a command. Use this parameter to submit commands to Windows PowerShell that require complex quotation marks or curly braces.

El comando original:

C:/Program Files/IIS/Microsoft Web Deploy/msdeploy.exe -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"

Se convierte en esto cuando se codifica como Base64:

QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA==

y aquí es cómo replicar en casa:

$command = ''C:/Program Files/IIS/Microsoft Web Deploy/msdeploy.exe -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"'' $bytes = [System.Text.Encoding]::Unicode.GetBytes($command) $encodedCommand = [Convert]::ToBase64String($bytes) $encodedCommand # The clip below copies the base64 string to your clipboard for right click and paste. $encodedCommand | Clip