none
Arrayinhalte abgleichen und Dateiinhalte prüfen RRS feed

  • 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
    Jannis

    P.S.: Get-Zip bzw.: $zipped.count gibt einfach den Wert aus, wie viele Dateien in der Zip-Datei enthalten sind.

    Donnerstag, 5. Dezember 2013 07:50

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

    Donnerstag, 5. Dezember 2013 15:48
  • 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

    Montag, 9. Dezember 2013 09:22
  • Na dann überprüf zuerst ob die Anzahl passt und dann verarbeite:

    if($zppedanzahl -eq $counter){
        foreach(...){
            #Tu etwas
        }
    }
    else{
        Write-Error "Ungleiche Anzahl von gezippten Files"
    }

    Der Code kommt natürlich nach der Schleife rein.

    lg

    Montag, 9. Dezember 2013 15:39
  • 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
    Dienstag, 10. Dezember 2013 12:12
  • 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

    Mittwoch, 11. Dezember 2013 08:59
  • 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...

    Donnerstag, 12. Dezember 2013 08:06
  • Hallo Alex,

    nein leider nicht, das Problem besteht weiterhin... ich bastel immer mal wieder ein bisschen und komme zurück zum eigentlichen Problem.

    Gruss,

    Jannis

    Donnerstag, 9. Januar 2014 10:46