Posso expressar minha necessidade com o seguinte cenário: Escreva uma função que aceite uma string para ser executada como um comando nativo.
Não é uma idéia muito longe buscada: se você estiver em interface com outros utilitários de linha de comando de outras partes da empresa que fornecem um comando para executar literalmente. Como você não controla o comando, você precisa aceitar qualquer comando válido como entrada . Estes são os principais soluços que não consegui superar facilmente:
O comando pode executar um programa vivendo em um caminho com um espaço nele:
$command = '"C:\Program Files\TheProg\Runit.exe" Hello';
O comando pode ter parâmetros com espaços neles:
$command = 'echo "hello world!"';
O comando pode ter marcações simples e duplas:
$command = "echo `"it`'s`"";
Existe alguma maneira limpa de fazer isso? Eu só consegui conceber soluções generosas e feias, mas para uma linguagem de script, acho que isso deve ser simples.
fonte
eval
é meio brincalhão, porque é assim que é chamado em muitas outras linguagens de script, e essa não é a primeira pergunta que eu vi sobre onde alguém não tinha idéiainvoke-expression
. E o caso do OP parece apenas um script interno.Invoke-Expression "& $command"
Consulte também este relatório do Microsoft Connect sobre essencialmente como é difícil usar o PowerShell para executar comandos do shell (oh, a ironia).
http://connect.microsoft.com/PowerShell/feedback/details/376207/
Eles sugerem o uso
--%
como uma maneira de forçar o PowerShell a parar de tentar interpretar o texto à direita.Por exemplo:
fonte
A resposta aceita não estava funcionando para mim ao tentar analisar o registro para desinstalar seqüências de caracteres e executá-las. Afinal, eu não precisava da ligação,
Invoke-Expression
afinal.Finalmente me deparei com este belo modelo para ver como executar seqüências de desinstalação:
Isso funciona para mim, principalmente porque
$app
é um aplicativo interno que eu sei que só terá dois argumentos. Para cadeias de desinstalação mais complexas, convém usar o operador de junção . Além disso, eu apenas usei um mapa de hash, mas, na verdade, você provavelmente desejaria usar uma matriz.Além disso, se você tiver várias versões do mesmo aplicativo instaladas, esse desinstalador percorrerá todas elas de uma só vez, o que confunde
MsiExec.exe
, então é isso também.fonte
Se você deseja usar o operador de chamada, os argumentos podem ser uma matriz armazenada em uma variável:
O operador de chamada também trabalha com objetos ApplicationInfo.
fonte