Como você executa o seguinte comando no PowerShell?
C: \ Arquivos de programas \ IIS \ Microsoft Web Deploy \ msdeploy.exe -verb: sync -source: dbfullsql = "Fonte de dados = mysource; Segurança integrada = false; ID do usuário = sa; Pwd = sapass!; Database = mydb;" -dest: dbfullsql = "Fonte de dados =. \ mydestsource; Segurança integrada = false; ID do usuário = sa; Pwd = sapass!; Banco de dados = mydb;", nome do computador = 10.10.10.10, nome do usuário = administrador, senha = adminpass "
powershell
parameters
quotes
exe
spaces
Vans
fonte
fonte
# Show any available updates to globally installed npm packages using the npm-check-updates tool [string] $cmd = 'ncu -g' Write-Verbose -Message $cmd Invoke-Command -ScriptBlock ([ScriptBlock]::Create($cmd))
Respostas:
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:
Se você deseja que o PowerShell interprete a sequência como um nome de comando, use o operador de chamada (&) da seguinte forma:
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:
Usando ecos, você pode experimentar até acertar, por exemplo:
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 .
fonte
echoargs
fornece uma indicação de como o PowerShell está interpretando os argumentos antes de transmiti-los ao EXE.& 'C:\Program Files\Sublime Text 3\sublime_text.exe'
diretamente no console e ele está funcionando, mas em um arquivo em lotes recebo um erro dizendo '& foi inesperado no momento'.START C:\"Program Files"\"Sublime Text 3"\sublime_text.exe
Basta adicionar o operador & antes do nome .exe. Aqui está um comando para instalar o SQL Server Express no modo silencioso:
fonte
Eu tinha espaços no comando e nos parâmetros, e é isso que funcionou para mim:
É basicamente o mesmo que a resposta do Akira, mas isso funciona se você construir dinamicamente seus parâmetros de comando e colocá-los em uma variável.
fonte
EchoArgs
Isso funcionou para mim:
Basta colocar caminhos ou cadeias de conexão em um item da matriz e dividir as outras coisas em um item da matriz cada.
Existem muitas outras opções aqui: https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx
A Microsoft deve tornar esse caminho mais simples e compatível com a sintaxe do prompt de comando.
fonte
Existem alguns métodos que você pode usar para fazer isso.
Método 1
Um exemplo simples
No seu caso
Nesse método, você separa cada parâmetro no ArgumentList usando vírgulas.
Método 2
Exemplo Simples
No seu caso
Este método é mais fácil, pois permite digitar seus parâmetros de uma só vez.
Referências: PowerShell / Scripting / Start-Process
fonte
Veja esta página: https://slai.github.io/posts/powershell-and-external-commands-done-right/
Resumo usando vshadow como executável externo:
fonte
Caso alguém esteja se perguntando como executar um arquivo executável:
.....>. \ file.exe
ou
......> completo \ caminho \ para \ arquivo.exe
fonte
Consegui fazer meu comando semelhante funcionar usando a seguinte abordagem:
Para o seu comando (não que isso ajude muito agora), as coisas seriam mais ou menos assim:
Os pontos principais são:
Eu não tentei adicionar a parte "nomedocomputador" no final da linha de comando, mas espero que essas informações ajudem outras pessoas que estão lendo isso a se aproximarem do resultado desejado.
fonte
Nova string de escape no PowerShell V3, citada em Novos Recursos do Idioma V3 :
A web está cheia de linhas de comando escritas para o Cmd.exe. Essas linhas de comando funcionam com bastante frequência no PowerShell, mas quando incluem determinados caracteres, por exemplo, um ponto-e-vírgula (;), um sinal de dólar ($) ou chaves, você precisa fazer algumas alterações, provavelmente adicionando algumas aspas. Esta parecia ser a fonte de muitas dores de cabeça menores.
Para ajudar a resolver esse cenário, adicionamos uma nova maneira de "escapar" da análise de linhas de comando. Se você usar um parâmetro mágico -%, interromperemos a análise normal da sua linha de comando e mudaremos para algo muito mais simples. Não combinamos aspas. Não paramos no ponto e vírgula. Não expandimos variáveis do PowerShell. Expandimos as variáveis de ambiente se você usar a sintaxe Cmd.exe (por exemplo,% TEMP%). Fora isso, os argumentos até o final da linha (ou canal, se você estiver canalizando) são passados como estão. Aqui está um exemplo:
fonte
Você pode usar:
O principal a ser observado aqui é que o FilePath deve estar na posição 0, de acordo com o Guia da Ajuda. Para chamar o guia de Ajuda de um commandlet, basta digitar
Get-Help <Commandlet-name> -Detailed
. Nesse caso, éGet-Help Start-Process -Detailed
.fonte
Tentei todas as sugestões, mas ainda não consegui executar
msiexec.exe
com parâmetros que continham espaços. Então, minha solução acabou usandoSystem.Diagnostics.ProcessStartInfo
:fonte
Isso funcionou para mim:
A chave parece ser que todo o comando está entre aspas externas, o "e" "comercial" é usado para especificar que outro arquivo de comando filho está sendo executado e, finalmente, as aspas com escape (dobrado-duplo-) ao redor do caminho / nome do arquivo com espaços em que você queria executar em primeiro lugar.
Isso também é a conclusão da única solução alternativa para o problema de conexão do MS que -File não repassa códigos de retorno diferentes de zero e -Command é a única alternativa. Mas até agora, pensava-se que uma limitação do comando era que não suportava espaços. Também atualizei esse item de feedback.
http://connect.microsoft.com/PowerShell/feedback/details/750653/powershell-exe-doesn-t-return-correct-exit-codes-when-using-the-file-option
fonte
Uma resposta alternativa é usar uma opção de comando codificado em Base64 :
Quando decodificado, você verá que é o snippet original do OP com todos os argumentos e aspas duplas preservados.
O comando original:
Isso se transforma quando codificado como Base64:
e aqui está como replicar em casa:
fonte
Você pode executar arquivos exe de maneiras diferentes no PowerShell. Por exemplo, se você deseja executar o unrar.exe e extrair um arquivo .rar, basta escrever no PowerShell:
Mas, às vezes, isso não funciona, portanto, você deve usar o parâmetro &, como mostrado acima: Por exemplo, com o vboxmanage.exe (uma ferramenta para gerenciar máquinas virtuais de caixa virtual), você deve chamar os parameteres fora da string dessa maneira, sem aspas:
Se você deseja chamar simplesmente um arquivo arquivado no winrar como arquivos .exe, também pode descompactá-lo com o cmdlet invoke-command e um parâmetro Silent / S (ele se extrairá na mesma pasta em que foi compactado).
Portanto, existem várias maneiras de executar arquivos .exe com argumentos no PowerShell.
Às vezes, é preciso encontrar uma solução alternativa para fazê-lo funcionar corretamente, o que pode exigir mais esforço e sofrimento :) dependendo da maneira como o .exe foi compilado ou criado por seus criadores.
fonte
Eu uso esse método simples, limpo e eficaz.
Coloco argumentos em uma matriz, 1 por linha. Dessa forma, é muito fácil ler e editar. Então eu uso um truque simples de passar todos os argumentos dentro de aspas duplas para uma função com 1 único parâmetro. Isso os nivela, incluindo matrizes, em uma única string, que eu executo usando a 'Invoke-Expression' do PS. Esta diretiva foi projetada especificamente para converter uma string em um comando executável. Funciona bem:
fonte
Eu tinha o seguinte código funcionando perfeitamente no meu laptop:
Então, quando tentei executá-lo diretamente em um servidor, comecei a receber esses erros
"Unrecognized argument ...etc.... All arguments must begin with "-". "
Depois de tentar todas as soluções possíveis (sem sucesso), descobri que o Powershell no servidor (Windows 2008 R2) era a versão 3.0, enquanto o meu laptop tinha 5.0. (você pode usar "$ PSVersionTable" para ver a versão).
Depois de atualizar o Powershell para a versão mais recente, ele começou a funcionar novamente.
fonte
O Cmd pode gerenciar a execução de um exe citado, mas o Powershell não pode. Eu só vou lidar com a execução do exe, já que não o tenho. Se você literalmente precisar enviar aspas duplas para o argumento de um comando externo, esse é outro problema que já foi abordado em outro lugar.
1) adicione a pasta exe ao seu caminho, talvez no seu perfil $
2) coloque entre aspas os espaços:
fonte
Então, encontrei um problema semelhante e resolvi resolvê-lo desta maneira:
invoke-expression
na nova sequênciaSolução de exemplo:
fonte
Para o nome do executável, o cmdlet new-alias pode ser empregado para evitar lidar com espaços ou precisar adicionar o executável ao ambiente $ PATH.
Para listar ou modificar aliases de PS, consulte também
De Jeffery Hicks Aarticle
Outras respostas abordam os argumentos.
fonte