2009-12-16 11 views
11

Sto cercando di eseguire un comando PowerShell per chiamare 7-Zip per comprimere una cartella utilizzando il seguente comando:Invoke-Expression con exe in Programmi

$command = $SevenZip + " a " + $targetDirForZip + $GetDateName + "_" + $dir.Name + ".7z " + $dir.FullName 
Invoke-Expression $command 

Le variabili immessa in comando $ sono già impostato e $ SevenZip è "c: \ Programmi \ 7-Zip \ 7z.exe"

Questo non funziona e sto cercando di trovare il modo migliore per chiamare 7-Zip da PowerShell. Idee?

risposta

21

Ho avuto lo stesso problema prima. Questo è un codice (quasi) direttamente da uno script di backup che uso attualmente:

[string]$pathToZipExe = "C:\Program Files\7-zip\7z.exe"; 
[Array]$arguments = "a", "-tgzip", $outputFilePath, $inputFilePath; 

& $pathToZipExe $arguments; 

ho ottenuto l'abitudine di utilizzare un array discussione con l'operatore di chiamata, Sembra essere più robusta rispetto ad altri metodi.

+0

Grazie! Perfezionare. – onupdatecascade

+0

Un modo per ottenere il codice di ritorno da exe? – Robin

3

In realtà non è necessario Invoke-Expression. Si può semplicemente richiamare il comando utilizzando la e commerciale come ad esempio:

&$Command 

Ma c'è anche il cmdlet Start-Process che potrebbe essere più adatto per quello che stai cercando di fare. Eseguendo il comando come una stringa sopra, si è inclini ad errori se $ SevenZip contiene spazi e non è quotato. Invece vorrei usare:

Start-Process $SevenZip "...rest..." 
1

Fammi indovinare, sta cercando di invocare "c: \ Program"?

Non sono sicuro della sintassi corretta per PS, ma è necessario fare qualcosa per quello spazio.

+1

corretto - questo è esattamente ciò che sta cercando di fare ... – Guy

6

Non è necessario utilizzare Invoke-Expression, basta utilizzare l'operatore di chiamata (chiamata) & per richiamare una stringa che denomina un comando da eseguire. Si noti che si desidera mantenere i parametri separano in questo caso vale a dire la stringa SevenZip dovrebbe essere solo il percorso per il file EXE ad es .:

&$SevenZip a "$targetDirForZip$GetDateName_$($dir.Name).7z" $dir.FullName 
0

funziona per me:

$command = "& ""$SevenZip""" + " a " + $targetDirForZip + $GetDateName + "_" + $dir.Name + ".7z " + $dir.FullName 

Write-Host "Running: $command" 

Invoke-Expression $command 
2

mi sono imbattuto in questo problema così, qui era la mia soluzione.

invoke-expression "& 'C:\Program Files\CIESetupClient\Staging\ffd4bc34-52c1-43e7-92d4-93d2f59d7f52\vstor_redist.exe' /q /norestart /log c:\Logs\VSTOR_Redist.log " 

ho potuto lasciare i miei paramaters fuori del singolo di citazioni che puntano al mio exe, credo che questo è probabilmente il modo più semplice per chiamare un exe con i parametri utilizzando richiamare-espressione.

+0

buona soluzione che ha funzionato per me – lara400

0

È inoltre possibile utilizzare i comandi MS-DOS da uno script di Windows PowerShell.

Ho sempre amato il comando START di CMD.exe, che consente di avviare un comando in parallelo.

Quindi per iniziare la 7-zip, inserire il seguente comando nello script PowerShell:

cmd.exe /c start <your 7-zip command like in MS-DOS> 
+0

questa risposta non aiuta comunque a risolvere il problema –

Problemi correlati