135335
01.02.2018, aktualisiert um 17:12:23 Uhr
1446
9
0
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.
und das hab ich hier eingefügt, weil es 15sekunden pausieren soll
Neue Sprache => schwere Sprache
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
EDIT
Habs selbst gelöst
Eigentlich ganz einfach wenn man es so denkt
Start-Sleep ist wie eine function
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
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
EDIT
Habs selbst gelöst
Eigentlich ganz einfach wenn man es so denkt
Start-Sleep ist wie eine function
function Start-Sleep ($seconds) {
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 363111
Url: https://administrator.de/contentid/363111
Ausgedruckt am: 26.11.2024 um 12:11 Uhr
9 Kommentare
Neuester Kommentar
Guten Morgen,
die erste Frage die sich mir stellt: Was willst du in der Funktion tun?
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?
VG
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
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
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:
Die ganzen For Schleifen die nur ein Sleep wiederholen kannst du auch direkt das Sleep verlängern und dir die Schleifen schenken.
VG
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
Servus,
ey is Buddy von den Toten auferstanden? .
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:
So, und nun gib dem Terence mal einen Tritt in den Hintern
Uwe
ey is Buddy von den Toten auferstanden? .
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
Uwe
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!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 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}
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: