135335
Goto Top

Write-Progress

Die Frage steht weiter unten!

Wenn ich das Skript ausführe, sehe ich kein ProgressBar, bzw geht auf einmal garnichts, bekomme auch keine Fehlermeldung im Powershell
Wenn ich nur den Codeschnipsel ausführe, funktioniert es.

    For ($i=15; $i -gt 1; $i–-) {  
        Write-Progress -Activity "Run" -SecondsRemaining $i  
        Start-Sleep 15
    }

und das hab ich hier eingefügt, weil es 15sekunden pausieren soll
function Get-run {
    For ($i=15; $i -gt 1; $i–-) {  
        Write-Progress -Activity "Run" -SecondsRemaining $i  
        Start-Sleep 15
    }
    $loopnum++
    write-host "Script has completed $loopnum loops."  
    write-host Parsing for errors...
    Get-nex0
}

Neue Sprache => schwere Sprache face-sad

Frage
Wird das jetzt mit while programmiert? Wenn ja

Muss ich meine ganzen funktionen umändern, dass nur mehr if else steht, also zum schluss anstatt get-nex0 einfach if (....) { ....} else {....}
Da hab ich extra dazu eine frage, wie weiß Powershell dann, das zuerst dieses if kommt und nicht das nächste?, oder muss ich das auch komplett neu anordnen?

Oder kann ich trotzdem functionen eingeben wie z.B neustart?


Soviele fragen face-sad face-sad face-sad


EDIT
Habs selbst gelöst
Eigentlich ganz einfach wenn man es so denkt
Start-Sleep ist wie eine function

function Start-Sleep ($seconds) {
}

Content-ID: 363111

Url: https://administrator.de/contentid/363111

Ausgedruckt am: 26.11.2024 um 12:11 Uhr

H41mSh1C0R
H41mSh1C0R 01.02.2018 um 01:01:15 Uhr
Goto Top
Guten Morgen,

die erste Frage die sich mir stellt: Was willst du in der Funktion tun?

Zitat von @135335:
und das hab ich hier eingefügt, weil es 15sekunden pausieren soll
function Get-run {
>     For ($i=15; $i -gt 1; $i–-) {  
>         Write-Progress -Activity "Run" -SecondsRemaining $i  
>         Start-Sleep 15
>     }
>     $loopnum++
>     write-host "Script has completed $loopnum loops."  
>     write-host Parsing for errors...
>     Get-nex0
> }

Deine For Schleife durchläuft 15 mal ein 15sekunden Sleep, das ist eine recht lange Pause. =)
Wo wird loopnum initiiert?
Was für eine Funktion soll Get-Nex0 sein?


Wenn du in einer Funktion "Abläufe" machen willst passt vielleicht ein Switch Konstrukt?

function Get-run {
    $loopnum=0
    while(1){
    Switch($loopnum) {
        0{$Detail = 'Die Variable ist 0'}  
        1{$Detail = 'Die Variable ist 1'}  
        2{$Detail = 'Die Variable ist 2'}  
        3{$Detail = 'Die Variable ist 3'}  
        4{$Detail = 'Die Variable ist 4'}  
        default{ return }    
    }
    $Detail
    start-sleep 15
    $loopnum++
    }
}    

VG
135335
135335 01.02.2018 um 02:58:25 Uhr
Goto Top
Zitat von @H41mSh1C0R:

Wenn du in einer Funktion "Abläufe" machen willst passt vielleicht ein Switch Konstrukt?

> function Get-run {
>     $loopnum=0
>     while(1){
>     Switch($loopnum) {
>         0{$Detail = 'Die Variable ist 0'}  
>         1{$Detail = 'Die Variable ist 1'}  
>         2{$Detail = 'Die Variable ist 2'}  
>         3{$Detail = 'Die Variable ist 3'}  
>         4{$Detail = 'Die Variable ist 4'}  
>         default{ return }    
>     }
>     $Detail
>     start-sleep 15
>     $loopnum++
>     }
> }    
> 

Switch würde bei meinem Fall eher weniger passen

Wo wird loopnum initiiert?
Loopnum steht in Get-run

So sieht verkürzt mein Script aus

$loopnum=0

$result0 = Get-Content "D:\Powershell\*.txt" | sort LastWriteTime -Descending | select -First 1 | Select-String -Pattern "$error0" -SimpleMatch -quiet  

function Get-start { 
cd "D:\Powershell\"   
START test.bat  #<Ist derzeit unwichtig
For ($i=10; $i -gt 1; $i–-) {  
    Write-Progress -Activity "Initalizing..." -SecondsRemaining $i  
    Start-Sleep 30
}
Get-run
}

function Get-run {
    For ($i=10; $i -gt 1; $i–-) {  
        Write-Progress -Activity "Run" -SecondsRemaining $i  
        Start-Sleep 15
    }
    $loopnum++
    write-host "Script has completed $loopnum loops."  
    write-host Parsing for errors...
    Get-nex0
}

function Get-run2ME {
For ($i=10; $i -gt 1; $i–-) {  
    Write-Progress -Activity "run2Me" -SecondsRemaining $i  
    Start-Sleep 10

If ($errorresult){
    write-host (Date) "befor neustart, check again"  
	Get-before_neustart_new_check
} ELSE {
    write-host (Date) "All is well."  
	Get-noerrors
}}
}

function Get-noerrors {
    write-host "No issues detected. Resume..."  
    Get-run
}

function Get-nex0 {
if ($result0) {
	write-host (Date) Errors found
	Get-run2ME
} ELSE {
    Get-nex1
}
} # läuft bis nex5, danach noerrors
H41mSh1C0R
H41mSh1C0R 01.02.2018 um 10:43:20 Uhr
Goto Top
So ganz klar ist meine Glaskugel noch nicht.

Für mich schaut das stark nach einer Ablaufsteuerung aus.

Get-Run
Get-Nex0
prüfe Fehler, wenn ja --> Get-run2Me, wenn nein --> Get-Nex1
prüfe Fehler, wenn ja --> Get-run2Me, wenn nein --> Get-Nex2
prüfe Fehler, wenn ja --> Get-run2Me, wenn nein --> Get-Nex3
prüfe Fehler, wenn ja --> Get-run2Me, wenn nein --> Get-Nex4
prüfe Fehler, wenn ja --> Get-run2Me, wenn nein --> Get-Nex5
prüfe Fehler, wenn ja --> Get-Run2Me, wenn nein --> fertisch =)

Zwischendurch immer brav Pausen einlegen und so weiter.

Wenn dem so ist passt doch ein Switch Perfekt:

 function Get-run {
     $loopnum=0
    $result0 = Get-Content "D:\Powershell\*.txt" | sort LastWriteTime -Descending | select -First 1 | Select-String -Pattern "$error0" -SimpleMatch -quiet  
     while(1){
     Switch($loopnum) {
         0{<Hier kommt alles rein was du bei Nex0 machst>}
         1{<Hier kommt alles rein was du bei Nex1 machst>}
         2{<Hier kommt alles rein was du bei Nex2 machst>}
         3{<Hier kommt alles rein was du bei Nex3 machst>}
         4{<Hier kommt alles rein was du bei Nex4 machst>}
         5{<Hier kommt alles rein was du bei Nex5 machst>}
         default{<hier kommt alles rein wenn du fertig bist oder ein Fehler aufgetreten ist> }    
     }
     start-sleep 15
     $loopnum++
     }
 }    

Die ganzen For Schleifen die nur ein Sleep wiederholen kannst du auch direkt das Sleep verlängern und dir die Schleifen schenken.

VG
135335
135335 01.02.2018 um 10:55:49 Uhr
Goto Top
Oky
Werde ich später ausprobieren
Und ja, ist ein Ablauf, der unendlich lange laufen soll
colinardo
colinardo 01.02.2018 aktualisiert um 11:23:36 Uhr
Goto Top
Servus,
ey is Buddy von den Toten auferstanden? face-smile.
Ehrlich gesagt bekomme ich Augenkrebs bei den Skripten hier ...

Da es hier anscheinend unterschwellig um eine Überwachung eines Logfiles geht hätte ich da was viel effektiveres mit FileSystemwatcher auf Lager:
# Datei deren Inhalt überwacht werden soll
$file = gci "D:\Powershell\*.txt" | sort LastWriteTime -Descending | select -First 1 -Expand Fullname  
# ---------
# variable enthält logfile inhalt für den kontinuierlichen Vergleich
$global:lastlog = gc $file
# Zeit der letzten Änderung
$global:lastchange = $null
# Eventuell existierenden Event subscriber löschen
Get-EventSubscriber FileChanged -EA SilentlyContinue | Unregister-Event -Force
# Filesystemwatcher erstellen
$fsw = New-Object IO.FileSystemWatcher (Split-Path $file -Parent), (Split-Path $file -Leaf) -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}   
# Filesystemwatcher registieren
Register-ObjectEvent $fsw Changed -SourceIdentifier FileChanged -Action {
    # Pfad zur Datei
    $fullpath = $Event.SourceEventArgs.FullPath
    # Änderungen nur verarbeiten wenn Zeit nicht exakt gleich ist (FSW Bugfix für doppelte Events)
    if ($global:lastchange -ne $Event.TimeGenerated){
        $global:lastchange = $Event.TimeGenerated
        # aktuellen Inhalt der Datei holen
        $currentData = (gc $fullpath)
        # Dateiinhalt vergleichen
        $changes = compare @($global:lastlog) @($currentData) -PassThru | ?{$_.SideIndicator -eq "=>"}  
        # wenn Änderungen da sind gebe sie auf der Konsole aus
        if ($changes){
            Write-Host "Änderung registriert:" -f Yellow  
            write-host ($changes | out-string) -BackgroundColor White -ForegroundColor Blue
            $global:lastlog = $currentData
        }
    }
} | out-null

cls
write-host "Überwache Datei '$file' auf Änderungen..." -F Green  
while($true){sleep 1}

So, und nun gib dem Terence mal einen Tritt in den Hintern face-wink
Uwe
135335
135335 01.02.2018 aktualisiert um 12:09:13 Uhr
Goto Top
ey is Buddy von den Toten auferstanden?
Ja


Danke für den Vorschlag
Nur da hackt es schon bei mir
Weil ich bei einem anderen Thread schon mal nur nebenbei angesprochen habe zwecks Dateiinhalt alle 15sekunden vergleichen, wie das funktionieren könnte, welche Cmdlet ich brauchen werde
Und jetzt passt das gerade dazu

# aktuellen Inhalt der Datei holen
        $currentData = (gc $fullpath)
        # Dateiinhalt vergleichen
        $changes = compare @($global:lastlog) @($currentData) -PassThru | ?{$_.SideIndicator -eq "=>"}  
 

# aktuellen Inhalt der Datei holen
        $currentData = (gc $fullpath)
        # Dateiinhalt vergleichen
        $changes = compare @($global:lastlog) @($currentData) -PassThru | ?{$_.SideIndicator -eq "=>"}  
 

Ich hoffe, Ihr versteht worauf ich hinaus will
Und zwar
135335
135335 01.02.2018 um 12:10:30 Uhr
Goto Top
Irgendwie übernimmt der Browser nicht mein ganzen Text

Mein Skript sucht Fehler in der letzten Logdatei und wenn der Fehler vorhanden ist, schreibt er mir immer Fehler gefunden, aber ich habe extra einen 2. Errorcheck eingebaut, weil sonst andauernd mein Programm schließt
Wenn nur 1 Fehler z.B. vor 1h gefunden wurde, wird der Fehler immer miteinbezogen, aber ich möchte nur die letzten 15 sekunden überprüfen ob ein Fehler gefunden wird und dann Sicherheitshalben nocheinmal bevor das Programm geschlossen wird
colinardo
colinardo 02.02.2018 aktualisiert um 11:27:58 Uhr
Goto Top
Zitat von @135335:
Wenn nur 1 Fehler z.B. vor 1h gefunden wurde, wird der Fehler immer miteinbezogen, aber ich möchte nur die letzten 15 sekunden überprüfen ob ein Fehler gefunden wird und dann Sicherheitshalben nocheinmal bevor das Programm geschlossen wird.
Das tut mein obiges Skript nicht, wenn du es wenigstens mal ausprobiert hättest, hättest du bemerkt das immer nur tatsächliche Änderungen seit der letzten Änderung der Logdatei gemeldet werden, also keine Änderungen vor Stunden!
Das Prinzip meines Skriptes ist folgendes:
Es wird ein FileSystemWatcher gestartet der immer nur dann das Action-Event ausführt wenn tatsächlich eine Änderung an der Datei durch das Dateisystem signalisiert wird. Am Anfang wird der Inhalt der Datei eingelesen sozusagen als Referenz. Wird nun an der Datei etwas hinzugefügt vergleicht das Skript den vorherigen Inhalt mit dem aktuellen Inhalt (via Compare-Object) und die Variable $changes enthält dann wirklich nur die akktuellen Änderungen seit dem letzten Speichern!! Dann wird automatisch für den nächsten Durchlauf der aktuelle Inhalt in die Variable $global:lastlog geschrieben so das bei einer erneuten Änderungen damit der Verglich stattfindet.
Also wird hier prinzipbedingt immer nur das neu hinzugekommene der Logdatei verglichen.

Willst du also feststellen das eine aktuelle Änderung den Text Error enthält machst du das folgendermaßen:

# Datei deren Inhalt überwacht werden soll
$file = gci "D:\Powershell\*.txt" | sort LastWriteTime -Descending | select -First 1 -Expand Fullname  
# ---------
# variable enthält logfile inhalt für den kontinuierlichen Vergleich
$global:lastlog = gc $file
# Zeit der letzten Änderung
$global:lastchange = $null
# Eventuell existierenden Event subscriber löschen
Get-EventSubscriber FileChanged -EA SilentlyContinue | Unregister-Event -Force
# Filesystemwatcher erstellen
$fsw = New-Object IO.FileSystemWatcher (Split-Path $file -Parent), (Split-Path $file -Leaf) -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}   
# Filesystemwatcher registieren
Register-ObjectEvent $fsw Changed -SourceIdentifier FileChanged -Action {
    # Pfad zur Datei
    $fullpath = $Event.SourceEventArgs.FullPath
    # Änderungen nur verarbeiten wenn Zeit nicht exakt gleich ist (FSW Bugfix für doppelte Events)
    if ($global:lastchange -ne $Event.TimeGenerated){
        $global:lastchange = $Event.TimeGenerated
        # aktuellen Inhalt der Datei holen
        $currentData = (gc $fullpath)
        # Dateiinhalt vergleichen
        $changes = compare @($global:lastlog) @($currentData) -PassThru | ?{$_.SideIndicator -eq "=>"}  
        # wenn Änderungen da sind gebe sie auf der Konsole aus
        if ($changes -and $changes -match 'Error'){  
            Write-Host "Error registriert:" -f Yellow  
            write-host ($changes | out-string) -BackgroundColor White -ForegroundColor Blue
            $global:lastlog = $currentData
        }
    }
} | out-null

cls
write-host "Überwache Datei '$file' auf Änderungen..." -F Green  
while($true){sleep 1}
Neu ist eigentlich nur Zeile 24, das Hinzufügen des zusätzlichen Vergleichs der Änderungen auf den String 'Error'.

Ich hatte das Skript ja eigentlich in jeder Zeile kommentiert, sollte also verständlich sein.

Naja du hast es ja anscheinend für dich selbst schon gelöst.

Dann wünsche ich dir weiterhin viel Erfolg.
Grüße Uwe

p.s. Noch ein paar Links für dich
Powershell Grundlagen- und Praxisvermittlung:
135335
135335 02.02.2018 um 19:29:27 Uhr
Goto Top
Danke