Fragensteller
Arrayinhalte abgleichen und Dateiinhalte prüfen

Allgemeine Diskussion
-
Guten Morgen,
die lange Berufsschulzeit ist erstmal rum und ich sitze endlich wieder an Powershell. Ich grüße in die Runde ;-) , denn ich möchte euch einmal mehr nerven.
Folgendes Skript hab ich soweit bauen können. Im Groben:
Ich habe eine CSV mit "username","GUMID" und ich möchte prüfen, dass alle Dateien die in $Source mit der "GUMID"1 gefunden wurden auch tatsächlich in der Zip angekommen sind die unter $SourceUsr\$username gespeichert wird.
Hinterher versuche ich das Ganze auch noch in eine Log zu schreiben und bei Erfolg die Dateien in $Source zu löschen...Ich verzweifle aber einfach an einem geschicktem Zähler oder dem Anlegen von Arrays in denen ich die Anzahl an gefunden Daten mit der GUMID verknüpfen und später prüfen kann. Die Zip-Datei wird nicht nach der GUMID sondern zu dem passenden Usernamen benannt.
Bitte schaut da mal drüber. Ich brauche einen zündenen Funken. Danke!
# Variablen $Source = "C:\MXPSKRIPT\Source\" $SourceUsr = "C:\MXPSKRIPT\SourceUsr" # Dateien (Listen) $GUM = "C:\MXPSKRIPT\List\GUMUser.csv" $Logs = "C:\MXPSKRIPT\List\Logs" # Dateien (Software) $Timestamp = (Get-Date -Format "yyyyMMdd-HH-mm") $TimestampDay = (Get-Date -Format "yyyyMMdd") # Mail-Support $MailAbsaender = "Skript@firma.com" $MailEmpfaenger = "j.kroeger@firma.com" $MailVersand = '0' ################################################# #Funktionen - die später verwendet werden müssen# ################################################# function Get-Zip { param([string]$zipfilename) if(test-path($zipfilename)) { $shellApplication = new-object -com shell.application $zipPackage = $shellApplication.NameSpace($zipfilename) $zipPackage.Items() | measure } } ################################################# #Start - Die Dateien werden den Usern zugeordnet# ################################################# $GUMListe = Import-Csv "$GUM" $Dateiliste = Get-ChildItem -Path $Source $SourceAnzahl = (Get-ChildItem $Source | Measure-Object).count #$asdf = 1 For ($i = 0 ; $i -le $SourceAnzahl ; $i++) { $asdf = 1 if(($Dateiliste | Measure-Object).count -ne "0") { $ia = $Dateiliste[$i] Foreach ($element in $GUMListe) { $username = $element.Username $GUMID = $element.GUMID $zippedanzahl = (Get-ChildItem "$Source$GUMID*.*" | Measure-Object).count Set-Variable -Name $counter$username if ($ia -match $GUMID) { $counter = 0 if (Test-Path $SourceUsr\$username) { #$zipped = Get-Zip "$SourceUsr\$username\$username.$Timestamp.zip" }#end if $zipped = Get-Zip "$SourceUsr\$username\$username.$Timestamp.zip" c:\MXPSKRIPT\7za.exe a -tzip "$SourceUsr\$username\$username.$Timestamp.zip" $Source$ia New-Item -Path $Logs\$username.$TimestampDay.log -ItemType file -Force #c:\MXPSKRIPT\7za.exe l -tzip "$SourceUsr\$username\$username.$Timestamp.zip" | Add-Content -Path $Logs\$username.$TimestampDay.log $zipped = Get-Zip "$SourceUsr\$username\$username.$Timestamp.zip" $zippedanzahl = (Get-ChildItem "$Source$GUMID*.*" | Measure-Object).count Write-Host "-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#" $ArrayUsernameCounter[$k] = "$username","$counter" $ArrayUsernameCounter.count $counter++ }#end if }#end Foreach }#end if else { if ($MailVersand -eq "1") { send-mailmessage -from $MailAbsaender -to $MailEmpfaenger -subject "Keine Datei gefunden $Timestamp" -Body "Die Dateiliste ist leer, keine Dateien in $Source gefunden!" -smtpserver emailserver } else { Write-Host "Die Dateiliste ist leer, keine Dateien in $Source gefunden!" }#end else if }#end else if } #For($i = 0 ; $i -le $SourceAnzahl ; $i++) #{ # if("$zipped.$GUMID" -eq $zippedanzahl) #{ # # }
Der Teil der "neu" ist und eben nicht funktioniert sind $ArrayUsernameCounter und die Verwendung von $counter++ .
Vielen Dank für eure Zeit.
Güße
JannisP.S.: Get-Zip bzw.: $zipped.count gibt einfach den Wert aus, wie viele Dateien in der Zip-Datei enthalten sind.
- Typ geändert Denniver ReiningMVP, Moderator Freitag, 30. Juni 2017 10:30 ....
Alle Antworten
-
hilfreich wäre es wenn du deine fehlermeldungen auch mitposten würdest.
was ich nicht ganz verstehe was du damit erreichen möchtest:
$ArrayUsernameCounter[$k] = "$username","$counter"
du hast weder $k initialisiert noch dein array selbst. abgesehen davon würde $k immer den gleichen wert behalten, da dieser auch nie inkrementiert wird.
ich weiß dass es zwar auch so funktioniert, allerdings würd ich dringend empfehlen deinen counter oben noch mit 0 zu initialisieren.
wenn du allerdings die aktuellen werte von $username und $counter jeweils in dein array pumpen möchtest geht das am besten so:
$counter = 0 $ArrayUsernameCounter = @()
#...in deiner schleife kannst du dann so dein Array befüllen $ArrayUsernameCounter += "$username $counter" $counter++
nach dem verlassen der schleife kannst du dann über den index auf die einzelnen elemente zugreifen.
ist wahrscheinlich nicht die lösung deines problems, aber das soll jetzt nur als denkanstoß dienen ;-)ach ja nochwas: in deiner for-schleife würd ich ein -lt statt -le verwenden, da du sonst mit dem letzten durchlauf immer ins leere fahren wirst (erstes element beginnt nämlich bei index 0 und endet mit index <anzahl der elemente> - 1)
gruß
speedy -
Moin moin Speedy,
vielen Dank für den Tipp mit -lt statt -le funktioniert super ;-)
Eine Fehlermeldung bekomme ich jetzt nicht mehr. Erreichen möchte ich folgendes:Innerhalb der Schleife wird die Anzahl der Dateien festgehalten, die pro GUMID gefunden wurden.
$zippedanzahl = (Get-ChildItem "$Source$GUMID*.*" | Measure-Object).count
Und ich kenne die Anzahl an Dateien in der Zip-Datei:
$zipped = Get-Zip "$SourceUsr\$username\$username.$Timestamp.zip" $zipped.count
Alles aber immer nur innerhalb der Schleife! Das Problem: wenn ich nun einen Check machen möchte, ob alle gezählten Dateien auch in der Zip angekommen sind, würde ich sehr viele "falsche"-Fehlermeldungen bekommen, denn erst wenn die Schleife komplett durch gelaufen ist, sind auch vermeintlich alle Dateien gezipped.
Nun möchte ich aus der Schleife geschickt "ausbrechen" und überprüfen, ob das alles zusammen passt was erledigt wurde.
Also wollte ich einen Zähler einbauen, der pro $GUMID einmal hochzählt, ist er auf dem gleichen Stand wie $zippedanzahl für die gerade bearbeitende $GUMID, soll geprüft werden und nicht vorher.
Ich hoffe doch das jetzt nicht alle Klarheiten beseitig sind.
Gruß aus dem Norden
Jannis
-
Moin,
Und genau da ist die Zwickmühle... so kommt der Zähler ja nie richtig hin...
Ich habs mal eingebaut wie es "theoretisch" klappen sollte...
(...) ################################################# #Start - Die Dateien werden den Usern zugeordnet# ################################################# $GUMListe = Import-Csv "$GUM" $Dateiliste = Get-ChildItem -Path $Source $SourceAnzahl = (Get-ChildItem $Source | Measure-Object).count #$counter = 1 For ($i = 0 ; $i -lt $SourceAnzahl ; $i++) { if(($Dateiliste | Measure-Object).count -ne "0") { $counter = 1 $ia = $Dateiliste[$i] Foreach ($element in $GUMListe) { $username = $element.Username $GUMID = $element.GUMID $zippedanzahl = (Get-ChildItem "$Source$GUMID*.*" | Measure-Object).count #Set-Variable -Name $counter$username if ($ia -match $GUMID) { if ($zippedanzahl -ne $counter) { $zipped = Get-Zip "$SourceUsr\$username\$username.$Timestamp.zip" c:\MXPSKRIPT\7za.exe a -tzip "$SourceUsr\$username\$username.$Timestamp.zip" $Source$ia New-Item -Path $Logs\$username.$TimestampDay.log -ItemType file -Force #c:\MXPSKRIPT\7za.exe l -tzip "$SourceUsr\$username\$username.$Timestamp.zip" | Add-Content -Path $Logs\$username.$TimestampDay.log $zipped = Get-Zip "$SourceUsr\$username\$username.$Timestamp.zip" $zippedanzahl = (Get-ChildItem "$Source$GUMID*.*" | Measure-Object).count Write-Host "-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#" $counter $counter++ $zipped.Count }#end if else { if ($zippedanzahl -ne $zipped.Count) { if ($MailVersand -eq "1") { send-mailmessage -from $MailAbsaender -to $MailEmpfaenger -subject "Zip-Pakete sind ungleich" -Body "In der Zip-Datei $username.$Timestamp.zip in $SourceUsr\$username fehlen Dateien!" -smtpserver mrhh01 } else { Write-Host "In der Zip-Datei $username.$Timestamp.zip in $SourceUsr\$username fehlen Dateien!" }#end else if }#end if }#end else }#end else if }#end Foreach }#end if else { if ($MailVersand -eq "1") { send-mailmessage -from $MailAbsaender -to $MailEmpfaenger -subject "Keine Datei gefunden $Timestamp" -Body "Die Dateiliste ist leer, keine Dateien in $Source gefunden!" -smtpserver mrhh01 }#end if else { Write-Host "Die Dateiliste ist leer, keine Dateien in $Source gefunden!" }#end else if }#end else if }#end For Write-Host "FERTIG" #For($i = 0 ; $i -le $SourceAnzahl ; $i++) #{ # if("$zipped.$GUMID" -eq $zippedanzahl) #{ # # }
Aber daraus wird so leider nichts... Ausgabe:
In der Zip-Datei USER1.20131210-13-06.zip in C:\MXPSKRIPT\SourceUsr\USER1 fehlen Dateien! 7-Zip (A) 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18 Scanning Creating archive C:\MXPSKRIPT\SourceUsr\USER2\USER2.20131210-13-06.zip Compressing 9954e66a-55e1-415d-a25a-7a980ddd689cmuhasdfqweudafdfasdff.txt Everything is Ok Verzeichnis: C:\MXPSKRIPT\List\Logs Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 10.12.2013 13:06 0 USER2.20131210.log -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# 1 1 7-Zip (A) 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18 Scanning Updating archive C:\MXPSKRIPT\SourceUsr\USER2\USER2.20131210-13-06.zip Compressing 9954e66a-55e1-415d-a25a-7a980ddd689cmuhasdfqweuf.txt Everything is Ok -a--- 10.12.2013 13:06 0 USER2.20131210.log -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# 1 2 7-Zip (A) 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18 Scanning Updating archive C:\MXPSKRIPT\SourceUsr\USER2\USER2.20131210-13-06.zip Compressing 9954e66a-55e1-415d-a25a-7a980ddd689cmuhasdfqweufasdfasdf.txt Everything is Ok -a--- 10.12.2013 13:06 0 USER2.20131210.log -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# 1 3 In der Zip-Datei USER3.20131210-13-06.zip in C:\MXPSKRIPT\SourceUsr\USER3 fehlen Dateien! FERTIG
setze ich das ganze nach der For-Schleife rein.... kann es ja eh nicht funktionieren.... da würde ja nur die letzte Datei "aufgegriffen".
LG
EDIT:
Im Grunde muss der $Counter "resettet" werden, wenn eine neue $GUMID genutzt wird bzw. sich der User ändert... dann sollte das so funktionieren wie es oben steht...- Bearbeitet Jannis K Dienstag, 10. Dezember 2013 15:49 Zähler resetten
-
ich meinte eigentlich, dass du den counter in deiner schleife hochzählen lässt, und wenn die schleife fertig ist, steht da die anzahl der tatsächlich gezippten files drinnen.
dann machst du eine abfrage (nach der schleife) ob die anzahl der files die gezipped werden müssen ($zippedanzahl = (Get-ChildItem "$Source$GUMID*.*" | Measure-Object).count) auch mit der der anzahl der tatsächlich gezippten files übereinstimmt ($counter)
wenn die bedingung erfüllt ist:
machst eine komplett neue schleife in der du die daten dann nochmal neu iterierst.
sonst kannst du eine exception schmeißen, da ja nur was passieren soll wenn alle daten auch erfolgreich gezippt wurden
-
wie soll das denn funktionieren?
in der Foreach-Schleife wird ja schon alles gepackt und wenn die fertig ist, sind ja für die jeweiligen User die Zip_Pakete fertig. Bei jedem einzelenen Durchgang ändert sich entsprechend die $zippedanzahl. Wenn ich den $counter einfach so hochzähle, hab ich nur gezählt wie viele Dateien insgesamt angefasst wurden, und nicht für den User spezifisch!
Also wie soll ich aus der Schleife Daten in eine andere übertragen, mit denen ich die $zippedanzahl und den $zipped mit einander abgleichen kann? Das ist einfach so Kopfzerbrechend...
-
Hallo Jannis,
hast Du in der Zwischenzeit die Ursache des Problems vielleicht gefunden?
Gruss,
Alex
Alex Pitulice, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.