Cuando PowerShell ve un comando que comienza con una cadena, solo evalúa la cadena, es decir, generalmente la muestra 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 (&) de la siguiente manera:
PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'
Después de eso, probablemente solo necesite citar pares de parámetro / argumento que contengan espacios y / o caracteres de cita. Cuando invocas un archivo EXE como este con argumentos complejos de línea de comandos, generalmente es muy útil tener una herramienta que te muestre cómo PowerShell envía los argumentos al archivo EXE. La Comunidad extensiones de PowerShell tiene una herramienta de este tipo. 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 estaba intentando demasiado antes 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 para mostrarme el encantamiento específico de 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 están motivados por la cantidad de personas afectadas por un problema en particular. Si esta es un área de dolor para usted, vote por favor envío de errores de PowerShell .
Para obtener más información sobre cómo se analiza PowerShell, consulte mi serie de blogs Efectivo de PowerShell , específicamente el artículo 10: "Descripció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. Vea esta publicación de blog para más detalles .