Benutzer mit den meisten Antworten
Probleme mit Write-Zip

Frage
-
Hallo Zusammen,
leider habe ich noch nicht viel Ahnung von Powershell und taste mich langsam vor...
ich habe folgendes Problem:ich habe alle täglichen Logfiles in ein monatliches Logfile zusammengefasst und möchte dieses monatliche Log in eine Zip-Datei "monatlicheLogs" schieben. Das soll für alle vorhandenen Ordner durchgeführt werden, deswegen die for-Schleife.
Mein momentan "chaotischer" Code:
Set-StrictMode -Version "2.0" Clear-Host Import-Module pscx $Source="D:\bla\bla\bla" $Destination="D:\bla\bla\bla\bla" #muss existieren $Level=1 #Alle Verzeichnisse $Folders=@(Get-ChildItem -Path $Source| Where-Object {$_.name -NotLike "Test1"}| Where-Object {$_.name -NotLike "Test2"} | Where{$_.PSISContainer -Match $true}) Set-Location D:\bla\bla $jahrmonat = "{0:yyyyMM}" -f (get-date).AddMonths(-1) #sammelt die tägl. Logs in monatliche nach folgendem Muster: XXX_yyyymm for ($i=0; $i -le $Folders.Length-1; $i++) {$Files=@(Get-ChildItem -Path $Folders[$i] | SELECT Name | Format-Table -AutoSize;) $Path= $Folders[$i] $Dateiname= $Path.Name + '_' + $jahrmonat + '.log' Add-Content -Path $Source\$Path\$Dateiname -Value (Get-Content -Path $Source\$Path\u_ex*.log) $Files| Write-Zip -path $Folders[$i] -level 1 -OutputPath $Destination\$_.zip -quiet | where {$_.name -notLike "u_*"}}
Die letzte Zeile funktioniert überhaupt nicht...bekomme als Fehlermeldung:
Write-Zip : The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.
Wäre über jede Hilfe dankbar! Sitze jetzt schon paar Wochen dran :-/
Vielen Dank!
- Bearbeitet Randy30 Montag, 27. Mai 2013 09:07
Antworten
-
Danke Brima! Sorry ! wenn man den code nicht testen kann... und PS 2.0 ISE hat keinen Klammer Prüfung :-(!
Hier der verbesserte Code:
Set-StrictMode -Version "2.0" Clear-Host Import-Module pscx $Source="D:\bla\bla\bla" $Destination="D:\bla\bla\bla\bla" #muss existieren $Level=1 $jahrmonat = "{0:yyyyMM}" -f (get-date).AddMonths(-1) #Alle Verzeichnisse $Folders=@(Get-ChildItem -Path $Source -Exclude 'Test1','Test2' | Where{$_.PSISContainer -Match $true}) #sammelt die tägl. Logs in monatliche nach folgendem Muster: XXX_yyyymm ForEach ($Folder in $Folders) { $Dateiname= $Folder.Name + '_' + $jahrmonat + '.log' Add-Content -Path (Join-Path $Folder.Fullname $Dateiname) -Value (Get-Content -Path (Join-Path $Folder.Fullname 'u_ex*.log')) ForEach ($File in Get-ChildItem -Path $Folder) { Write-Zip -path $File.Fullname -Level $Level -OutputPath (Join-Path $Destination ($File.Name + '.zip')) -quiet | Where {$_.name -notLike "u_*"} } }
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!
- Bearbeitet Peter Kriegel Montag, 27. Mai 2013 10:26
- Als Antwort markiert Randy30 Mittwoch, 29. Mai 2013 07:41
-
Wenn du an eine ZIP Datei etwas anhängen willst musst du den Parameter –Append nehmen!
Der Name bleibt ja gleich!if ($File.name -notlike "u_*") { Write-Zip -path $File.Fullname -Level $Level -OutputPath -Append (Join-Path $Destination ($Folder.Name + '.zip')) -quiet -Append }
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!- Bearbeitet Peter Kriegel Dienstag, 28. Mai 2013 15:41
- Als Antwort markiert Randy30 Mittwoch, 29. Mai 2013 08:33
Alle Antworten
-
1. Bitte nicht Where-Object hintereinander schreiben! Dazu benutzt man -and oder -or verknüpfungen.
1a. Where-Object ist nicht sehr Performant (aber sehr nützlich). Deshalb sollte man immer schauen ob ein Cmdlet nicht schon Filter anbietet! Filter immer so früh wie möglich!
Get-ChildItem biete gute Filter ohne das man Where-Object bemühen muss!
Lies dir die Hilfe zu Get-ChildItem durch!
http://www.colorconsole.de/PS_Windows/de/Get-ChildItem.htm
2. Die Format-xxxx Cmdlets NIEMALS dafür benutzen Daten zu bekommen!
Diese sind nur für die Anzeige am Bildschirm oder die Ausgabe in Textdateien gedacht!
Zum erhalten von Daten in der Pipeline ist Select-Object zuständig!
3. Um alle Items einer Liste (Array) durchzulaufen nimmt man die ForEach Schleife nicht die For Schleife!
4. Kennst du den Unterschied zwischen dem Property .Name und .Fullname?Das müsste es tun Ungetestet!:
Set-StrictMode -Version "2.0" Clear-Host Import-Module pscx $Source="D:\bla\bla\bla" $Destination="D:\bla\bla\bla\bla" #muss existieren $Level=1 $jahrmonat = "{0:yyyyMM}" -f (get-date).AddMonths(-1) #Alle Verzeichnisse $Folders=@(Get-ChildItem -Path $Source -Exclude 'Test1','Test2' | Where{$_.PSISContainer -Match $true}) #sammelt die tägl. Logs in monatliche nach folgendem Muster: XXX_yyyymm ForEach ($Folder in $Folders) { $Dateiname= $Folder.Name + '_' + $jahrmonat + '.log' Add-Content -Path (Join-Path $Folder.Fullname $Dateiname) -Value (Get-Content -Path (Join-Path $Folder.Fullname 'u_ex*.log') ForEach ($File in Get-ChildItem -Path $Folder) { Write-Zip -path $File.Fullname -Level $Level -OutputPath (Join-Path $Destination $_.zip -quiet | where {$_.name -notLike "u_*"} } }
Kauf dir ein gutes PowerShell Buch!
http://www.admin-source.de/BlogDeu/buecher-books
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!
- Bearbeitet Peter Kriegel Montag, 27. Mai 2013 09:11
-
Ich bin ein Stück weiter. Ich habe die letzte Zeile folgendermaßen ersetzt:
Write-Zip -path .\Folders[i]\$Dateiname -level 1 -OutputPath $Destination\$Dateiname.zip -quiet
jetzt bekomme ich keine Fehlermeldung, er zipped auch, ABER ohne Inhalt....
Ich weiß nicht nicht warum! Der Pfad ist richtig gesetzt....
Bitte um Denkanstoß :-(
-
Hallo Peter Kriegel,
Vielen Dank für die Antwort und Hilfe! Ja, ich muss noch einiges Lernen...
Ich habs grad getestet, bekomme aber folgende Fehlermeldung:
Property 'zip' cannot be found on this object. Make sure that it exists.
Welche Änderung muss ich hier noch machen?
- Bearbeitet Randy30 Montag, 27. Mai 2013 09:53
-
Hi,
bei Peters Vorschlag fehlt in der Add-Content Zeile am Ende eine runde Klammer zu >)<
und der ZIP Fehler liegt vermutlich hier >$_.zip<
In der Write-Zip Zeile fehl auch noch eine <)<Beste Gruesse
brima- Bearbeitet brima Montag, 27. Mai 2013 10:08 Write-zip
-
Danke Brima! Sorry ! wenn man den code nicht testen kann... und PS 2.0 ISE hat keinen Klammer Prüfung :-(!
Hier der verbesserte Code:
Set-StrictMode -Version "2.0" Clear-Host Import-Module pscx $Source="D:\bla\bla\bla" $Destination="D:\bla\bla\bla\bla" #muss existieren $Level=1 $jahrmonat = "{0:yyyyMM}" -f (get-date).AddMonths(-1) #Alle Verzeichnisse $Folders=@(Get-ChildItem -Path $Source -Exclude 'Test1','Test2' | Where{$_.PSISContainer -Match $true}) #sammelt die tägl. Logs in monatliche nach folgendem Muster: XXX_yyyymm ForEach ($Folder in $Folders) { $Dateiname= $Folder.Name + '_' + $jahrmonat + '.log' Add-Content -Path (Join-Path $Folder.Fullname $Dateiname) -Value (Get-Content -Path (Join-Path $Folder.Fullname 'u_ex*.log')) ForEach ($File in Get-ChildItem -Path $Folder) { Write-Zip -path $File.Fullname -Level $Level -OutputPath (Join-Path $Destination ($File.Name + '.zip')) -quiet | Where {$_.name -notLike "u_*"} } }
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!
- Bearbeitet Peter Kriegel Montag, 27. Mai 2013 10:26
- Als Antwort markiert Randy30 Mittwoch, 29. Mai 2013 07:41
-
Es funktioniert!!!
Vielen Dank Brima, vielen Dank nochmal an Peter Kriegel!!!!
Ich habe jetzt noch 2 Fragen:
wie schon erwähnt wird dieses Script 1 Mal im Monat über einen Task laufen gelassen.
d.h. jeden Monat wird eine neue log-Datei erstellt. Ich habe dann also
bla_201304.log und
bla_201305.log
Jetzt soll aber auch letzteres in das zuvor erstellte Zip-Archiv geschoben werden. Also die Log Dateien der folgenden Monate.
Dann wäre es sinnvoller, doch die letzten 11 Zeichen des Zip-Names zu entfernen... Wie kann ich diese beiden Dinge realisieren?
Vielen Dank für eure Hilfe! -
Gegen diese Vorgehensweise sprechen mehrere Gründe
1. Bei einzelnen Monatliche ZIP-Dateien ist ein Monat leichter wiederzufinden
2. Die gesamte Datengröße bleibt ungefähr gleich
3. Wenn alle Monate in einer Datei gezippt werden, sind alle Monate futsch, wenn die ZIP Datei defekt ist!
4. Die ZIP Datei wird irgendwann zu gross!
Wenn du trotzdem alles in einer ZIP Datei haben möchtest dann nimm doch für die ZIP Datei einen Festen Namen!
Wenn du an eine ZIP Datei etwas anhängen willst musst du den Parameter –Append nehmen!if ($File.name -notlike "u_*") { Write-Zip -path $File.Fullname -Level $Level -OutputPath -Append (Join-Path $Destination 'DateiMitFestemNamen.zip') -quiet }
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!- Bearbeitet Peter Kriegel Dienstag, 28. Mai 2013 07:15
-
vielen Dank Peter....
deine Gründe sind Berechtigt. Problem dabei: die Datei muss den Namen des jeweiligen Ordners haben, deswegen kann ich keinen festen Namen verwenden.
Problem Nr.2: Der Zielordner würde alle Monate von allen verschiedenen Ordnern (Webauftitte) enthalten. D.h.:
Zielordner\Webauftritt 1_201304.zip, Webauftritt 1_201305.zip, Webauftritt 2_201304.zip Webauftritt 2_201305, für Webauftritt 3_ usw..
Das wäre nicht ganz so übersichtlich. Es sollte so aussehen:
Zielordner\Webauftritt1.zip\Webauftritt 1_201304.log, Webauftritt 1_201305.log, ...
Zielordner\Webauftritt2.zip\Webauftritt 2_201304.log, Webauftritt 2_201305.log, ...
ich hoffe ich hab das einigermaßen rüber bringen können....
vielen Dank...
- Bearbeitet Randy30 Dienstag, 28. Mai 2013 08:36
-
Genau! Wenn man sein Problem (anderen) beschreibt und eine Ordentliche Frage daraus macht, hat man meist auch die Antwort ;-))
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum! -
-
Wenn du an eine ZIP Datei etwas anhängen willst musst du den Parameter –Append nehmen!
Der Name bleibt ja gleich!if ($File.name -notlike "u_*") { Write-Zip -path $File.Fullname -Level $Level -OutputPath -Append (Join-Path $Destination ($Folder.Name + '.zip')) -quiet -Append }
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!- Bearbeitet Peter Kriegel Dienstag, 28. Mai 2013 15:41
- Als Antwort markiert Randy30 Mittwoch, 29. Mai 2013 08:33
-
Brachst du nur einmal ! Mein Fehler ;-)
Warum brauche ich dann hier 2x -Append?
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!