Invocar-Expressão com exe Program Files
-
20-09-2019 - |
Pergunta
Estou tentando executar um comando Powershell para chamar o 7-Zip zip para uma pasta usando o seguinte comando:
$command = $SevenZip + " a " + $targetDirForZip + $GetDateName + "_" + $dir.Name + ".7z " + $dir.FullName
Invoke-Expression $command
As variáveis a serem alimentados em $comando já estão definidas e $SevenZip é "c:\Program Files\7-Zip\7z.exe"
Isso não está funcionando e eu estou tentando descobrir a melhor maneira de chamar 7-Zip do Powershell.Ideias?
Solução
Eu tive o mesmo problema de antes.Este código é (quase) reta a partir de um script de backup que eu uso atualmente:
[string]$pathToZipExe = "C:\Program Files\7-zip\7z.exe";
[Array]$arguments = "a", "-tgzip", $outputFilePath, $inputFilePath;
& $pathToZipExe $arguments;
Adotei o hábito de usar um argumento array com o operador de chamada, parece ser mais robusto do que os outros métodos.
Outras dicas
Você não precisa usar o Invocar-Expressão é só usar a invocação (chamada) operador de &
para invocar uma seqüência de caracteres de nomes de um comando a ser executado.Observe que você deseja manter os parâmetros separado, neste caso, i.é.a cadeia SevenZip deve ser apenas o caminho para o EXE por exemplo:
&$SevenZip a "$targetDirForZip$GetDateName_$($dir.Name).7z" $dir.FullName
Você realmente não precisa Invocar-Expressão.Você pode simplesmente chamar o comando utilizando o e comercial, tais como:
&$Command
Mas há também o Início do Processo cmdlet o que pode ser mais adequado para o que você está tentando fazer.Ao executar o comando como uma seqüência de caracteres acima, você está propenso a erros se o $SevenZip contém espaços e não é citado.Em vez disso, eu usaria:
Start-Process $SevenZip "...rest..."
Eu tive esse problema, pois bem, aqui foi a minha solução.
invoke-expression "& 'C:\Program Files\CIESetupClient\Staging\ffd4bc34-52c1-43e7-92d4-93d2f59d7f52\vstor_redist.exe' /q /norestart /log c:\Logs\VSTOR_Redist.log "
eu era capaz de deixar o meu parametros fora as aspas simples apontando para o meu exe, eu acho que isso é provavelmente a maneira mais fácil chamar um exe com parâmetros usando invocar-expressão.
Deixe-me adivinhar, é tentar invocar "c:\Program"?
Não tenho certeza de que a sintaxe correta para o PS, mas você vai precisar para fazer algo sobre esse espaço.
Funciona para mim:
$command = "& ""$SevenZip""" + " a " + $targetDirForZip + $GetDateName + "_" + $dir.Name + ".7z " + $dir.FullName
Write-Host "Running: $command"
Invoke-Expression $command
Você também pode usar comandos de MS-DOS de dentro de um script do Windows PowerShell.
Eu sempre amei CMD.exe's comando de partida, que permite que você iniciar um comando em paralelo.
Então, para iniciar o 7-zip, coloque o seguinte comando no seu script do Powershell:
cmd.exe /c start <your 7-zip command like in MS-DOS>