Executando um comando armazenado em uma variável do PowerShell


152

Eu tenho um comando que eu criei e armazenei em uma variável no PowerShell. Este comando funciona se eu fizer um host de gravação e copiar e colar em uma cmd.exejanela padrão .

Como executo esse comando de dentro do meu script?

Eu tentei várias combinações de Invoke-Command ou Invoke-Expression sem sorte.

Foi assim que construí a variável:

$cmd1 = $arcprg + $arcdir + "\" + $site1 + "-" + $hst + "-" + $yesterday + ".zip " + $logpath1 + "u_ex" + $yesterday + ".log"

É assim que a variável se parece se for impressa na tela:

7z.exe a -tzip c:\arc_logs\site-host-at-web1-100827.zip c:\inetpub\logs\logfiles\w3svc1\u_ex100827.log

Respostas:


207

Aqui está outra maneira sem, Invoke-Expressionmas com duas variáveis ​​(comando: string e parâmetros: array). Isso funciona bem para mim. Suponha que 7z.exeesteja no caminho do sistema.

$cmd = '7z.exe'
$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& $cmd $prm

Se o comando for conhecido (7z.exe) e apenas os parâmetros forem variáveis, isso fará com que

$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& 7z.exe $prm

BTW, Invoke-Expressioncom um parâmetro também funciona para mim, por exemplo, isso funciona

$cmd = '& 7z.exe a -tzip "c:\temp\with space\test2.zip" "C:\TEMP\with space\changelog"'

Invoke-Expression $cmd

PS: Geralmente, prefiro o caminho com uma matriz de parâmetros, porque é mais fácil compor programaticamente do que construir uma expressão para Invoke-Expression.


Isso é ótimo. Está começando a se unir agora. Em vez de 'c: \ temp \ com espaço \ test1.zip', posso apenas usar uma variável $? Preciso colocá-lo como "" ou ''?
Travis

Splatting parece funcionar da mesma: & $ cmd @prm Mas estou curioso sobre por que é que
C2H5OH

44

Tente chamar seu comando com Invoke-Expression:

Invoke-Expression $cmd1

Aqui está um exemplo de trabalho na minha máquina:

$cmd = "& 'C:\Program Files\7-zip\7z.exe' a -tzip c:\temp\test.zip c:\temp\test.txt"
Invoke-Expression $cmd

iexé um alias para Invoke-Expressionque você possa fazer:

iex $cmd1

Para obter uma lista completa: Visite https://ss64.com/ps/ para obter mais informações Powershell.

Boa sorte...


Informa-me O termo '7z.exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log' não é reconhecido como o nome de um arquivo cmdlet, função, arquivo de script ou programa operável. Verifique a ortografia do nome ou, se um caminho foi incluído, verifique se o caminho está correto e tente novamente. No: Linha: 14 Char: 1 + & <<<< $ cmd1
Travis

@ Travis: Opa. o "e comercial" funciona se não houver argumentos. Atualizei a postagem com uma solução para seu comando.
precisa saber é o seguinte

Eu tentei invocar-expressão antes e não funcionou. Ele cospe o erro: Constante numérica inválida: 7. Na: linha: 1 caractere: 2 + 7z <<<< .exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log Parece que ele está tentando avaliá-lo em vez de executá-lo.
Travis

@ Travis: Pode ser que o 7z.exe não esteja no seu caminho. Verifique se ele está no caminho e / ou tente dar o nome completo do caminho ao executável em sua expressão.
precisa saber é o seguinte

1
@ Travis: Acabei de confirmar no meu próprio sistema que o 7z.exe deu o erro que você descreveu, apenas digitando no prompt de comando, mas com o caminho completo para o 7z.exe (para mim 'C:\Program Files\7-zip\7z.exe', eu poderia executar o 7z.exe.
precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.