none
Änderungsdatum auslesen

    Frage

  • Hallo Zusammen,

    ich habe hier ein Skript den ich gerne komplett in Powershell haben möchte, kann mir jemand ggf. helfen?

    Momentan läuft es über eine Bat Datei:

    @echo off & setlocal
    set "SMTP=IP"
    set "SUBJECT=Mini01-04 Excel"
    set "FROM=Powershell@%computername%"
    set "TO=skript@domain.de"
    
    
    powershell -Executionpolicy ByPass -Command "$report = (gci '\\MINI01.local\excel\*' -Include '11111.xls','22222.xls','33333.xls' | %%{$result = @{$true='OK';$false='FEHLER'}[$_.LastWriteTime.Date -eq (get-date).Date]; \"Datum fur $($_.Fullname) : ^<span style="color:$(@{'OK'='green';'FEHLER'='red'}[$result])"^>$result ^</span^>^<br^>\"}) -join [environment]::Newline; Send-MailMessage -To '%TO%' -Subject '%SUBJECT%' -BodyAsHtml -Body $report -SmtpServer '%SMTP%' -From '%FROM%'"
    
    

    Hier sind meine ersten Versuche, leider komme ich nicht weiter... Powershell ist echt mächtig und bin dabei mich so langsam einzuarbeiten.

    $QueryResult = Get-ChildItem -Path '\\MINI01\excel\*','\\MINI02\excel\*','\\MINI03\excel\*','\\MINI04\excel\*' -Include '11111.xls','22222.xls','33333.xls'
    
    
    If($QueryResult){
        $Report = $QueryResult  | 
            Select-Object -Property Name,LastWriteTime,{$result =@{$true='OK';$false='FEHLER'}[$_.LastWriteTime.Date -eq (get-date).Date]; \"Datum fur $($_.Fullname) : ^<span style="color:$(@{'OK'='green';'FEHLER'='red'}[$result]) | 
                    Out-String
    }
    Else{
        $Report ='Keine Aktuelle xls im Ordner'
    }
    
    $MailMessage = @{ 
              From = "Powershell@$ENV:ComputerName" 
                To = 'skript@domain.de' 
           Subject = 'DateiInformationen'
              Body = $Report
        Smtpserver = 'IP' 
    }
    
    Send-MailMessage @MailMessage

    Mittwoch, 19. April 2017 09:52

Antworten

  • Vielen Dank werde es weiterhin versuchen, sonst werde ich aufgeben :)

    Das ist mehr als Kopfweh, für Powershell bin ich nicht weit genug, da bleibe ich lieber nur bei PHP

    Oh man oh Man

    Aufgeben ist keine Option ... sowas lassen wir hier nicht durchgehen!!!  ;-) 

    ... und dabei dachte ich, dass bei Powershell die "Einstiegshürde" viel niedrieger ist als bei den "kassischen" Script/Programmiersprachen.

    Ich weiß ja nicht, wie Du auf die Powershell gekommen bist und wie Du Dich bisher der Powershell genähert hast. Aber vielleicht hilft Dir so ein generelles Grundverständnis der Philosophie und Standard-Mechanismen ja weiter. Ein guter Einstieg ist der kostenlos von Microsoft verfügbare "Jumpstart" in der MVA.


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    • Als Antwort markiert michi-ffm Freitag, 21. April 2017 06:36
    Donnerstag, 20. April 2017 10:45

Alle Antworten

  • ... das hatten wir schon mal, oder?  ;-)

    Dateigröße und Änderungsdatum auslesen

    Was funktioniert denn nicht?


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 19. April 2017 09:55
  • ... das hatten wir schon mal, oder?  ;-)

    Dateigröße und Änderungsdatum auslesen

    Was funktioniert denn nicht?


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Fast ich versuche dein skript zu erweitern, da ich dieses im Unternehmen gerne einbringen möchte.

    Das ist nun ein anderes Skript der Prüft nun, ob die 3 Dateien existieren und den Aktuellen Datum haben, anschließend erhalte ich eine Mail die so aussieht.

    Datum fur \\MINI01\excel\11111.xls : OK
    Datum fur \\MINI01\excel\22222.xls : OK
    Datum fur \\MINI01\excel\33333.xls : OK

    Datum fur \\MINI02\excel\11111.xls : OK
    Datum fur \\MINI02\excel\22222.xls : OK
    Datum fur \\MINI02\excel\33333.xls : OK

    Datum fur \\MINI03\excel\11111.xls : OK
    Datum fur \\MINI03\excel\22222.xls : OK
    Datum fur \\MINI03\excel\33333.xls : OK

    Datum fur \\MINI04\excel\11111.xls : OK
    Datum fur \\MINI04\excel\22222.xls : OK
    Datum fur \\MINI04\excel\33333.xls : OK

    Das Skript funktioniert auch ohne Probleme jedoch leider in eine bat datei, möchte es gerne komplett in powershell haben.

    Mittwoch, 19. April 2017 10:00
  • na ma kukn .... 
    $FilesToCheck = '\\MINI01\excel\11111.xls',
    '\\MINI01\excel\22222.xls',
    '\\MINI01\excel\33333.xls',
    '\\MINI02\excel\11111.xls',
    '\\MINI02\excel\22222.xls',
    '\\MINI02\excel\33333.xls',
    '\\MINI03\excel\11111.xls',
    '\\MINI03\excel\22222.xls',
    '\\MINI03\excel\33333.xls',
    '\\MINI04\excel\11111.xls',
    '\\MINI04\excel\22222.xls',
    '\\MINI04\excel\33333.xls'
    
    $ResultList = Foreach($File in $FilesToCheck){
        $Result = Get-Item -Path $File.FullName | Select-Object -Property FullName,@{'Name'='Status';Expression={If((Get-Date $_.LastWriteTime).Date -eq (Get-Date).Date ){'OK'}Else{'Failure'}}}
        [PSCustomObject]@{
            'Path' = $Result.FullName
            'Status' = $Result.Status
        }
    }
    
    $Body = $ResultList | ConvertTo-Html -Fragment -As Table
    Damit kannst Du Dir die Status-Liste zusammen bauen  und in ein HTML-Fragment einpacken. Und wie Du ne Mail mit Powershell verschickst, weißt Du ja schon.  ;-)

    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 19. April 2017 12:29
  • Vor Ihnen muss man sich echt verbeugen, nach mehreren Stunden bekommt man echt davon Kopfweh

    Leider habe ich eine Fehlermeldung, habe es auch mit dem Ausschlussverfahren versucht aber uff neh keine Chance :)

    Get-Item : Das Argument kann nicht an den Parameter "Path" gebunden werden, da es NULL ist.
    In C:\Tasks\Excel_pruefen.ps1:16 Zeichen:30
    +     $Result = Get-Item -Path $File.FullName | Select-Object -Property FullName,@ ...
    +                              ~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidData: (:) [Get-Item], ParameterBindingValidationException
        + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.GetItemCommand



    • Bearbeitet michi-ffm Freitag, 21. April 2017 06:35
    Mittwoch, 19. April 2017 15:12
  • Wir Duzen uns hier und verbeugen ist auch unnötig. Wenn ich das nächste Mal in ffm bin, trinken wir einfach ein Bier zusammen.  ;-)

    Der Fehler ist mein Fehler. Ich hatte zum Testen reale Dateien auf meinem System benutzt. Du musst einfach bei "$File.FullName" das ".FullName" weglassen. Also nur "$File" (ohne Punkt). Das sollte dann funktionieren.  Und die Dateien sollten auch so existieren, wie Du sie in Deinem Beispiel angegeben hast.

    Du könntest die Auflistung der Dateien auch aus dem Script auslagern und aus einer Text-Datei einlesen.

    Also einfach die Dateinamen in einer einfachen Textdatei untereinander auflisten. z.B. FileList.txt im gleichen Verzeichnis wie das Script. Dann kannst Du mit 

    $FilesToCheck = Get-Content -Path "$PSScriptRoot\FileList.txt"
    die Liste der Dateien einlesen und dann und brauchst das Script nicht anpassen, falls sich die Dateinamen mal ändern.


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 19. April 2017 18:20
  • Ich gib gern einen aus :)

    Vielen Dank für deine Bemühungen echt der Hammer.

    funktioniert alles soweit, leider liest er irgendwie nur die letzte Zeile aus.

    Also in meiner Mail steht nur das hier, Hast du eine Idee?:

    @{FullName=\\MINI04\excel\33333.xls; Status=OK}



    • Bearbeitet michi-ffm Freitag, 21. April 2017 06:35
    Donnerstag, 20. April 2017 07:15
  • Sieht danach aus, dass Du die Ausgabe nicht in html umgewandelt hast.

    Um einen Fehler zu finden, ist es häufig hilfreich, das Script in der Powershell_ISE schrittweise auszuführen und die Ausgaben in der Konsole zu kontrollieren ... ob sie den erwarteten Ausgaben entsprechen.

    Bei mir funktioniert der Teil bis zum Email-Senden. Das Senden kann ich hier auf Arbeit im Moment nicht testen.


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''



    • Bearbeitet BOfH_666 Donnerstag, 20. April 2017 08:45
    Donnerstag, 20. April 2017 08:44
  • Vielen Dank werde es weiterhin versuchen, sonst werde ich aufgeben :)

    Das ist mehr als Kopfweh, für Powershell bin ich nicht weit genug, da bleibe ich lieber nur bei PHP

    Oh man oh Man


    • Bearbeitet michi-ffm Freitag, 21. April 2017 06:35
    Donnerstag, 20. April 2017 09:50
  • Vielen Dank werde es weiterhin versuchen, sonst werde ich aufgeben :)

    Das ist mehr als Kopfweh, für Powershell bin ich nicht weit genug, da bleibe ich lieber nur bei PHP

    Oh man oh Man

    Aufgeben ist keine Option ... sowas lassen wir hier nicht durchgehen!!!  ;-) 

    ... und dabei dachte ich, dass bei Powershell die "Einstiegshürde" viel niedrieger ist als bei den "kassischen" Script/Programmiersprachen.

    Ich weiß ja nicht, wie Du auf die Powershell gekommen bist und wie Du Dich bisher der Powershell genähert hast. Aber vielleicht hilft Dir so ein generelles Grundverständnis der Philosophie und Standard-Mechanismen ja weiter. Ein guter Einstieg ist der kostenlos von Microsoft verfügbare "Jumpstart" in der MVA.


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    • Als Antwort markiert michi-ffm Freitag, 21. April 2017 06:36
    Donnerstag, 20. April 2017 10:45
  • eigentlich habe ich mich mit DOS eingearbeitet und in Forums wurde mir immer wieder Powershell vorgeschlagen, so kam ich nun auf Powershell :S

    Ein PHP Programmierer der noch nie was mit Powershell zu tun hatte und dann solche Projekte oh man :)

    Das Ding ist ja nur, ich habe momentan 2 Skripte die ich nutze für mein Unternehmen dieses hier und ein anderes und sonst werde ich Powershell nie wieder nutzen :) Das ist mir doch eine Liga zu Hoch für mich.

    Schon allein HTML in Powershell einzubinden lach ich mich schlapp ^^

    Ich versuch es jedoch weiterhin bis ich dieses Skript Fertig habe, ich muss jeden Morgen jedes mal die XLS auf den Clients prüfen und das Manuell und das ist schon nervig :)

    Vielen Dank werde ich mir anschauen Jumpstart


    • Bearbeitet michi-ffm Freitag, 21. April 2017 06:36
    Donnerstag, 20. April 2017 10:57
  • Schon allein HTML in Powershell einzubinden lach ich mich schlapp ^^

    ... hmmm ... naja, die Powershell ist halt eher für Systemverwaltungsaufgaben gemacht ... und das macht sie dann aber auch richtig gut ... für html gibt's ja dann auch schon viele anderes Sachen.

    Na denn, ich drück die Daumen.


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Donnerstag, 20. April 2017 11:15
  • Michi, wenn deine Frage damit beantwortet ist, bitte noch die Antwort markieren.
    Und in Zukunft bitte beim Antworten nicht jedesmal den vorherigen Beitrag zitieren, das ist unnötig und macht den Thread sehr unübersichtlich.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Donnerstag, 20. April 2017 18:52
    Moderator
  • Hallo @BOfH_666,

    ich bins nochmal ich komme leider nicht weiter :(

    evtl kannst du mir das letzte mal helfen?

    Mein Output bleibt weiterhin :

    @{FullName=\\MINI04\excel\3333.xls; Status=OK}

    Habe echt schon vieles versucht und kein Schritt weiter.

    Er sendet mir nur die letzte Position.

    vor 22 Stunden 20 Minuten
  • Poste doch mal bitte das komplette Script - mit allem drum und dran hier ins Forum und mit der entsprechenden Option hier im Editor als Code formatiert, bitte.

    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    vor 19 Stunden 7 Minuten
  • Guten Morgen,

    gerne hier der Code:

    $FilesToCheck = 
    '\\MINI01\excel\1111.xls',
    '\\MINI01\excel\2222.xls',
    '\\MINI01\excel\3333.xls',
    '\\MINI02\excel\1111.xls',
    '\\MINI02\excel\2222.xls',
    '\\MINI02\excel\3333.xls',
    '\\MINI03\excel\1111.xls',
    '\\MINI03\excel\2222.xls',
    '\\MINI03\excel\3333.xls',
    '\\MINI04\excel\1111.xls',
    '\\MINI04\excel\2222.xls',
    '\\MINI04\excel\3333.xls'
    $ResultList = Foreach($File in $FilesToCheck){
    
        $Result = Get-Item -Path $File | Select-Object -Property FullName,@{'Name'='Status';Expression={If((Get-Date $_.LastWriteTime).Date -eq (Get-Date).Date ){'OK'}Else{'Failure'}}}
        [PSCustomObject]@{
            'Path' = $Result.FullName
            'Status' = $Result.Status
        }
    }
    $Body = $ResultList | ConvertTo-Html -Fragment -AS Table
    
    $MailMessage = @{ 
              From = "Powershell@$ENV:ComputerName" 
                To = 'skript@domain.de' 
           Subject = 'Excel Prüfen'
              Body =  $Result  
        Smtpserver = 'IP' 
    }
    
    Send-MailMessage @MailMessage

    Ausgabe in der Mail sieht wie folgt aus:

    @{FullName=\\MINI04\excel\3333.xls; Status=OK}

    vor 4 Stunden 12 Minuten
  • Da hättest Du auch selber drauf kommen können, wenn Du Dir das Script aufmerksam angesehen hättest. Das Script enthält eine Schleife, die für jede einzelne Datei das Datum prüft und einen Status generiert. In dieser Schleife heißt die Variable, die nur innerhalb der Schleife benutzt wird und auch nur dort Sinn macht "$Report". Alle Status zusammen, werden in der Variablen "$ResultList" gesammelt. (Die kannst Du Dir übrigens auf der Konsole ansehen, wenn Du es kontrollieren möchtest.)

    Diese wird dann umgewandelt in ein HTML-Fragment welches in der Variablen "$Body" gespeichert wird.

    Und jetzt schau Dir mal bitte an, was Du "Send-MailMessage" als Body-Parameter übergibst.  ;-)

    Wenn man ein Script "debuggen" möchte, hilft es meistens sehr, es in der ISE entweder schrittweise und wenigstens abschnittweise auszuführen. Also einfach einen funktional zusammengehörigen Teil markieren und dann entweder F8 drücken oder in der Symbolleiste das "Blatt Papier mit dem grünen Dreieck" klicken. Dann kannst Du in der Konsole die Ausgabe kontrollieren.

    Es lassen sich auch Teile von ganzen Zeilen markieren und separat ausführen. Oder nur ein Variablenname  ... um zu sehen, was die Variable gerade enthält.


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH_666 vor 1 Stunde 44 Minuten
    vor 1 Stunde 47 Minuten
  • Stimmt hat keinen Sinn, jedoch habe ich echt vieles getestet und komme nicht auf die Lösung Debuggen habe ich auch schon gemacht.

    Ich kann nur sagen das ich mich jetzt etwas im ISE eingelesen habe und arbeiten kann.

    So sollte es doch eigentlich funktionieren oder nicht?

    $ResultList = Foreach($File in $FilesToCheck){
    
        $Report = Get-Item -Path $File | Select-Object -Property FullName,@{'Name'='Status';Expression={If((Get-Date $_.LastWriteTime).Date -eq (Get-Date).Date ){'OK'}Else{'Failure'}}}
        [PSCustomObject]@{
            'Path' = $Result.FullName
            'Status' = $Result.Status
        }
    }
    $Body = $ResultList | ConvertTo-Html -Fragment -AS Table
    
    $MailMessage = @{ 
              From = "Powershell@$ENV:ComputerName" 
                To = 'skript@domain.de' 
           Subject = 'DateiInformationen'
              Body =  $Report  
        Smtpserver = 'IP' 
    }
    
    Send-MailMessage @MailMessage

    vor 27 Minuten
  • So sollte es doch eigentlich funktionieren oder nicht?

    Nein, denn...

    $ResultList = Foreach($File in $FilesToCheck){

    Hier speicherst Du alles in $ResultList.

    $Body = $ResultList | ConvertTo-Html -Fragment -AS Table

    Hier erstellst Du einen $Body, den Du aber...

    $MailMessage = @{
              From = "Powershell@$ENV:ComputerName"
                To = 'skript@domain.de'
           Subject = 'DateiInformationen'
              Body =  $Report

    ...hier nicht verwendest...

    Body = $Body wäre geeigneter :-)))

    vor 18 Minuten
  • Ausführlich das weis ich auch und das mit $Body habe ich auch schon getestet jedoch kommt diese meldung:

    Send-MailMessage : "System.Object[]" kann nicht in den Typ "System.String" konvertiert werden, der für den Parameter "Body" erforderlich ist. Die angegebene Methode wird nicht unterstützt.
    In C:\Aufgabenplanung\test.ps1:32 Zeichen:18
    + Send-MailMessage @MailMessage
    +                  ~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (:) [Send-MailMessage], ParameterBindingException
        + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.SendMailMessage

    vor 13 Minuten