Domanda

Sto cercando di eseguire un comando PowerShell per chiamare 7-Zip per comprimere una cartella utilizzando il seguente comando:

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

Le variabili vengono nutriti in comando $ sono già impostati e $ SevenZip è "C: \ Program Files \ 7-Zip \ 7z.exe"

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

È stato utile?

Soluzione

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.

Altri suggerimenti

Non è necessario utilizzare Invoke-Expression basta usare il & invocazione (call) all'operatore di richiamare una stringa che nomina 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 per esempio:.

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

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, siete inclini a errori se il $ SevenZip contiene spazi e non è citato. Invece vorrei utilizzare:

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

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 dalle virgolette singole indicando il mio exe, credo che questo è probabilmente il modo più semplice per chiamare un exe con i parametri utilizzando richiamare-espressione.

Fammi indovinare, che sta cercando di richiamare "C: \ Programmi"?

Non sono sicuro della sintassi corretta per PS, ma avrete bisogno di fare qualcosa per quello spazio.

Lavora per me:

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

Write-Host "Running: $command"

Invoke-Expression $command

È inoltre possibile utilizzare i comandi di MS-DOS all'interno di uno script di Windows PowerShell.

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

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

    cmd.exe /c start <your 7-zip command like in MS-DOS> 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top