2013-07-16 7 views
5

Ho bisogno di creare un .zip di ogni directory in un elenco in PowerShell. Per qualche ragione non riesco a capire come cambiare in ogni directory per eseguire un comando relativo a quel percorso però.Esecuzione di un comando in ogni directory in un elenco utilizzando PowerShell

Ecco la mia situazione:

$dir = Get-ChildItem d:\directory | ? {$_.PSIsContainer} 

$dir | ForEach-Object {Set-Location $_.FullName; 
Invoke-Expression "7z.exe A" + $_.Name + ".rar " + $_.Path + "\"} 

Il comando è brutto, ma a causa del modo in cui 7Zip sembra analizzare il testo, ho dovuto andare in questo modo. Credo che il comando dovrebbe creare un file ZIP in ogni directory, con il nome impostato uguale al nome della directory e includere tutti i file nella directory.

Sembra che io sia bloccato in qualche inferno PowerShell anche se non posso nemmeno accedere ai valori degli oggetti per qualche motivo.

Ad esempio, se echo $ dir, vedo il mio elenco di directory. Tuttavia, se provo

gci $dir[1] 

PowerShell non restituisce nulla. In realtà non sta enumerando il percorso della directory contenuto all'interno della proprietà della variabile, ma cerca invece di elencare gli elementi contenuti all'interno di quel valore, che ovviamente sarebbero vuoti.

Cosa dà ?! Come faccio a fare questo?

+0

Quindi, ho trovato un altro metodo in un forum diverso. Fondamentalmente avevo bisogno di separare le mie funzioni di navigazione delle directory dalla mia costruzione di comandi, e stavo pensando troppo a cose. In effetti, mi ero dimenticato del metodo ForEach ($ var in $ vars) di ricorsare attraverso un array. http://sourceforge.net/p/sevenzip/discussion/45797/thread/49a7a85b/ – FoxDeploy

+0

Per rendere la vostra chiamata zip più ordinata utilizzare un alias: Set-Alias ​​sz "C: \ Windows \ 7za.exe"; sz A -tzip "$ ($ _. Nome) .rar" $ _. Percorso –

risposta

9

Non è necessario impostare la posizione, è sufficiente fornire percorsi a 7z.exe. Inoltre, 7zip non comprime su Rar, solo decomprime.

$dir = dir d:\directory | ?{$_.PSISContainer} 

foreach ($d in $dir){ 
    $name = Join-Path -Path $d.FullName -ChildPath ($d.Name + ".7z") 
    $path = Join-Path -Path $d.FullName -ChildPath "*" 

    & "C:\Program Files\7-Zip\7z.exe" a -t7z $name $path 
} 
Problemi correlati