Quando o PowerShell vê um comando que começa com uma string, ele apenas avalia a string, ou seja, normalmente faz eco na tela, por exemplo:
PS> "Hello World"
Hello World
Se você deseja que o PowerShell interprete a sequência como um nome de comando, use o operador de chamada (&) da seguinte forma:
PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'
Depois disso, você provavelmente só precisará citar pares de parâmetros / argumentos que contêm espaços e / ou caracteres de cotação. Quando você invoca um arquivo EXE como este com argumentos complexos de linha de comando, geralmente é muito útil ter uma ferramenta que mostre como o PowerShell envia os argumentos para o arquivo EXE. As extensões da comunidade do PowerShell possuem essa ferramenta. É chamado eco. Você acabou de substituir o arquivo EXE por echoargs - deixando todos os argumentos no lugar, e ele mostrará como o arquivo EXE receberá os argumentos, por exemplo:
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 ecos, você pode experimentar até acertar, por exemplo:
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;>
Acontece que eu estava tentando muito antes manter as aspas duplas em torno da cadeia de conexão. Aparentemente, isso não é necessário porque mesmo o cmd.exe os removerá.
BTW, tiramos o chapéu para a equipe do PowerShell. Eles foram bastante úteis para me mostrar o encantamento específico de aspas simples e duplas para obter o resultado desejado - se você precisasse manter as aspas duplas internas no lugar. :-) Eles também percebem que essa é uma área de dor, mas são motivados pelo número de pessoas afetadas por um problema específico. Se essa é uma área problemática para você, vote neste envio de bug do PowerShell .
Para obter mais informações sobre como o PowerShell analisa, confira a série de blogs do PowerShell efetivo - especificamente o item 10 - "Compreendendo os modos de análise do PowerShell"
ATUALIZAÇÃO 4/4/2012: Essa situação fica muito mais fácil de lidar no PowerShell V3. Veja esta postagem do blog para obter detalhes .