Zum Inhalt wechseln


Foto

Powershell - ForEach-Object -> sequentiell


  • Bitte melde dich an um zu Antworten
11 Antworten in diesem Thema

#1 gearloose

gearloose

    Newbie

  • 53 Beiträge

Geschrieben 29. Juli 2011 - 10:06

Hallo,

wollte mal kurz nachhören ob jemand was dazu weiß. Ich lasse mir aus einem Verzeichnis Dateien anzeigen die mit 7-Zip komprimiert werden sollen.

Das klappt auch wunderbar nur die PS arbeitet das nicht sequentiell ab sondern parallel :-( ... der macht mir also bei 4 Dateien 4 Zip-Tasks auf.

Kann man das so einrichten das die Dateien nacheinander abgearbeitet werden???

Es ist ja so wenn ich danach noch eine Befehlszeile schreibe und die ist zum Löschen der nicht gezippten Dateien gedacht macht der das auch direkt und 7-Zip greift voll ins Klo.

Bedeutet der will die Daten Zippen und aber auch direkt löschen. Die Powershell bekommt das denke ich mal nicht mit was 7-Zip da gerade abarbeitet.

Get-ChildItem -Path B:\...... -Exclude *.zip | ForEach-Object -Process {C:\Programme\7-Zip\7zG.exe a -tzip $_'.zip' $_}

Bearbeitet von gearloose, 29. Juli 2011 - 11:26.


#2 Dukel

Dukel

    Board Veteran

  • 6.215 Beiträge

Geschrieben 29. Juli 2011 - 11:24

Nimm die CLI Version 7za (evtl. extra Downloaden).

#3 mamamia

mamamia

    Member

  • 213 Beiträge

Geschrieben 29. Juli 2011 - 11:29

Moin,

ich kann dir dazu die PowerShell Community Extensions ans Herz legen.
Dort gibt es Write-Zip

Write-Zip -OutputPath "C:\tmp\zip\files.zip" -Path "C:\tmp\zip\*"

Bei diesem Aufruf werden alle Files unter C:\tmp\zip in das Archiv C:\tmp\zip\files.zip geschrieben.
Gucks dir mal na.

Ansonsten hast du einen kleinen Denkfehler in deinem Syntax. Du rufst zu jedem File den Prozess auf, daher bekommst du x-Archive raus.

dir "C:\tmp\zip\" -Recurse -Include "*.txt" | Write-Zip -OutputPath "C:\tmp\zip\files.zip"
So könnte es auch gehen, du kannst halt an C:\Programme\7-Zip\7zG.exe a -tzip keine Objekte oder eine FileList übergeben.
________________________________________________________
MCSE/A 2003 | MCST 2008 | MCITP SA 2008 | VMWare VCP
einer der wenigen programmierenden SysAdmins :cool:

#4 gearloose

gearloose

    Newbie

  • 53 Beiträge

Geschrieben 29. Juli 2011 - 12:00

Stimmt..danke :-) ich denke wirte-Zip löst da mein Problem...teste das mal aus.

Dann klappt auch das anschließende Löschen der Dateien ohne zeitlich schon vorzugreifen. :D

#5 mamamia

mamamia

    Member

  • 213 Beiträge

Geschrieben 29. Juli 2011 - 12:23

Stimmt..danke :-) ich denke wirte-Zip löst da mein Problem...teste das mal aus.

Dann klappt auch das anschließende Löschen der Dateien ohne zeitlich schon vorzugreifen. :D


Auf die schnelle fällt mir das ein:
dir "C:\tmp\zip\" -Recurse -Include "*.txt" -OutVariable files | Write-Zip -OutputPath "C:\tmp\zip\files.zip"
remove-item $files

Ich wüsste grad nicht, wie man das noch pipen könnte.
________________________________________________________
MCSE/A 2003 | MCST 2008 | MCITP SA 2008 | VMWare VCP
einer der wenigen programmierenden SysAdmins :cool:

#6 Dukel

Dukel

    Board Veteran

  • 6.215 Beiträge

Geschrieben 29. Juli 2011 - 12:32

Wieso nutzt man nicht die Funktion des Zippers (k.A. ob write-zip das kann) die Daten zu verschieben statt kopieren? Dabei sorgt sich der Zipper um das löschen und das nicht löschen beim Fehler (kein Platz mehr für Zip Files).

#7 mamamia

mamamia

    Member

  • 213 Beiträge

Geschrieben 29. Juli 2011 - 12:35

Wieso nutzt man nicht die Funktion des Zippers (k.A. ob write-zip das kann) die Daten zu verschieben statt kopieren? Dabei sorgt sich der Zipper um das löschen und das nicht löschen beim Fehler (kein Platz mehr für Zip Files).


Weil es Write-Zip nicht kann.
Sonst hätte ich das schon so eingekippt

ÜBERSICHT
PSCX Cmdlet: Create ZIP format archive files from pipline or parameter input.


SYNTAX
Write-Zip [-LiteralPath] <String[]> [[-OutputPath] <String>] [-Append] [-FlattenPaths] [-IncludeEmptyDirectories] [-Level <Nullable`1>] [-NoClobber] [-Quiet] [<CommonPar
ameters>]

Write-Zip -InputObject <PSObject> [[-EntryPathRoot] <String>] [-Append] [-FlattenPaths] [-IncludeEmptyDirectories] [-Level <Nullable`1>] [-NoClobber] [-Quiet] [<CommonPa
rameters>]

Write-Zip [-Path] <String[]> [-Append] [-FlattenPaths] [-IncludeEmptyDirectories] [-Level <Nullable`1>] [-NoClobber] [-Quiet] [<CommonParameters>]

Es gibt zwar in Blogs wie hier 8 bits: Create ZIP archives with PowerShell, den Befehl -removeOriginal, der scheint aber nicht mehr verfügbar zu sein.
________________________________________________________
MCSE/A 2003 | MCST 2008 | MCITP SA 2008 | VMWare VCP
einer der wenigen programmierenden SysAdmins :cool:

#8 gearloose

gearloose

    Newbie

  • 53 Beiträge

Geschrieben 02. August 2011 - 09:44

Hallo, habs getestet und write-zip klappt sequentiell :-) das löst das Problem!

Problem war ja das ich extern 7-Zip aufgerufen habe und die Powershell das ja nicht nacheinander abgearbeitet hat da es ja sozusagen kein hauseigener Prozess ist. Daher ruft man bei x Dateien x Prozesse auf.

Wäre auf dem Server kein Problem gewesen 32GB RAM und 2 x 4Kern Xeon.

...wenn man die Daten danach noch im Skript löschen will haut es dem 7-Zip die zu komprimierenden Daten unter den Füßen weg und es bricht ab.

get-childitem -path \...\... -include *.bak | foreach-object -process {write-zip $_}

Die Extensions sind ja auch schnell "installiert" einmal ins Modulverzeichnis und importiert.

@Dukel: Ich hab bei 7-Zip in den Commandline Options nix gefunden womit ich Dateien nach dem Zippen entfernen könnte. Wäre sogar komfortabler gewesen und für mich letzt endlich einfach. Ich muss das mit write-zip jetzt an einige Server nachziehen und dazu noch die Powershell 2.0 installieren.

#9 mamamia

mamamia

    Member

  • 213 Beiträge

Geschrieben 02. August 2011 - 09:45

Freut mich, viel Spaß damit!
________________________________________________________
MCSE/A 2003 | MCST 2008 | MCITP SA 2008 | VMWare VCP
einer der wenigen programmierenden SysAdmins :cool:

#10 Dukel

Dukel

    Board Veteran

  • 6.215 Beiträge

Geschrieben 02. August 2011 - 10:34

[...]
Problem war ja das ich extern 7-Zip aufgerufen habe und die Powershell das ja nicht nacheinander abgearbeitet hat da es ja sozusagen kein hauseigener Prozess ist. Daher ruft man bei x Dateien x Prozesse auf.
[...]


Nur zur Ergänzung:
Wie schon geschrieben braucht man die CLI Version von 7Zip (7za.exe), die es extra zum DL gibt.

#11 gearloose

gearloose

    Newbie

  • 53 Beiträge

Geschrieben 04. August 2011 - 12:44

Hi Dukel,

hast du für die Lösung mit der CLI Version von 7zip ein kurzes Beispiel.

Hab mir mal kurz die Commandos angeschaut aber ich finde da nicht wirklich was. Der Befehl "d - delete" ist ja für zip-Archive und nicht für die Dateiebene.

#12 Dukel

Dukel

    Board Veteran

  • 6.215 Beiträge

Geschrieben 04. August 2011 - 13:42

Es ging um das serielle abarbeiten und nicht um das löschen (move) der Daten. Das geht leider mit 7Zip nicht.