Benutzer mit den meisten Antworten
Schleife geht nicht

Frage
-
Hallo an Euch,
Ich komme in die Schleife Hinein aber nicht mehr Heraus.
Was war da Wohl Falsch?
Danke im Voraus
Arnold
cls Set-ExecutionPolicy RemoteSigned $errorActionPreference = 'SilentlyContinue' $xwget = 'C:\NouveauBAO\wget.exe' $xtmp = 'C:\NouveauBAO\tmp.txt' $xOld_file = 'C:\NouveauBAO\arenas.bat' $xNew_file = 'C:\NouveauBAO\arenas1.bat' $xWorkFile = 'C:\NouveauBAO\batcharenas.bat' $env:path += ';C:\NouveauBAO' # By times (to run...) $xTimes = ([System.DateTime]::Now.Hour.ToString() -eq 0) -lt ([System.DateTime]::Now.Hour.ToString() -eq 8)` -or ([System.DateTime]::Now.Hour.ToString() -eq 8) -lt ([System.DateTime]::Now.Hour.ToString() -eq 17)` -or ([System.DateTime]::Now.Hour.ToString() -eq 17) -lt ([System.DateTime]::Now.Hour.ToString() -eq 22)` -or ([System.DateTime]::Now.Hour.ToString() -eq 22) -lt ([System.DateTime]::Now.Hour.ToString() -eq 23)` -or ([System.DateTime]::Now.Hour.ToString() -eq 23) -lt ([System.DateTime]::Now.Hour.ToString() -eq 24) function replace { (Get-Content $xOld_file) | % { $_ -replace 'wget.exe', $xwget` -replace 'tmp.txt', $xtmp } | Set-Content $xNew_file -Force Remove-Item $xOld_file -Force Rename-Item $xNew_file $xOld_file -Force } $xi = [System.DateTime]::Now.Hour.ToString() for ($xi; $xi -le $xTimes ) { # Get-ChildItem C:\NouveauBAO -include $Old_file -recurse | ? { -not $($(Get-Content $_) -match “C:\NouveauBAO\wget.exe”) } if ($xOld_file -notcontains 'C:\NouveauBAO\wget.exe'){replace} # try {get-process -Name C:\windows\system32\cmd.exe /c $WorkFile} try {C:\windows\system32\cmd.exe /c $xWorkFile} catch { $_.Exception.Message } $xi ++ while ($xOld_file.busy) { sleep -milliseconds 500 } # try {get-process -Name C:\windows\system32\cmd.exe /c $WorkFile | stop-process -force} } clear-variable x* -scope global
Antworten
-
Moin,
Der scripte Beinhaltet 30 links. Siehe 1. Aufzeichnung. Alle kommen nicht durch.
Darum gibt es Fehlmeldungen. Mit der 2. version unterdrücke ich die Fehlmeldungen mit:
" $errorActionPreference = 'SilentlyContinue' "na ja, Fehler sind nicht da, um unterdrückt zu werden.
Würdest Du die Fehler nicht unterdrücken, würde die PowerShell z.B. an dieser Stelle "$xi ++" eine Fehlermeldung und einen Abbruch bringen.
Dadurch, dass Du den Fehler unterdrückst, geht das Script einfach weiter.
So Weit ok, aber ich komme immer noch nicht aus der Schleife heraus.
Das haben Dir Peter und ich ja ausführlich erklärt: Du würfest Variablentypen durcheinander und doe Abbruchbedingung kann daher nie erfüllt werden.
Da zumindest ich schon gar nicht verstehe, wass Du mit dem Script überhaupt machen willst (z.B. was genau diese vielen, merkwürdigen [System.DateTime]::Now.Hour.ToString() Vergleiche - die eh nicht funktionieren - erreichen sollen), ist es auch schwer, zu helfen.
Wir können Dir nur sagen, was falsch ist.
Grüße aus Berlin schickt Robert
MVP Exchange Server- Als Antwort markiert arnold_ Sonntag, 29. Juli 2012 20:05
-
Danke,
Ich werde es noch mals Überarbeiten.
ps:
Mit dem scripte wollte ich nur wissen, wie viele reconnextion ich in einer gewissen Zeitabschnitte bekomme.
Arnold
Alle Antworten
-
Moin,
Was war da Wohl Falsch?
Du verwürfelst verschiedene Typen miteinander.
# By times (to run...)
$xTimes = ([System.DateTime]::Now.Hour.ToString() -eq 0) -lt ([System.DateTime]::Now.Hour.ToString() -eq 8)`
-or ([System.DateTime]::Now.Hour.ToString() -eq 8) -lt ([System.DateTime]::Now.Hour.ToString() -eq 17)`
-or ([System.DateTime]::Now.Hour.ToString() -eq 17) -lt ([System.DateTime]::Now.Hour.ToString() -eq 22)`
-or ([System.DateTime]::Now.Hour.ToString() -eq 22) -lt ([System.DateTime]::Now.Hour.ToString() -eq 23)`
-or ([System.DateTime]::Now.Hour.ToString() -eq 23) -lt ([System.DateTime]::Now.Hour.ToString() -eq 24)Das hier sind doch nur Vergleiche (über den Sinn will ich gar nicht nachdenken, Du vergleichst Strings mit Zahlen und danach true und false-Ergebnisse).
$xTimes hat also am Ende einen Boolschen Wert $true oder $false (wenn ich das richtig sehe, müsste das immer ein $false sein).
$xi = [System.DateTime]::Now.Hour.ToString()
$xi bekommt hier einen String, keine Zahl.
for ($xi; $xi -le $xTimes )
Hier vergleichst Du den Boolschen Wert von oben mit dem String darunter.
Bedingt durch die automatische Typkonvertierung wird der Boolschen Wert in einen String konvertiert und es wird daher der String von Hour mit dem String "true" oder "false" vergleichen.
Technisch sieht der Vergleich als z.B. so aus: "23" -le "true"
Na ja, und Ziffern sind bei String vergleichen immer "kleiner" (Sortierreihenfolge), als Buchstaben. Daher ergibt dieser Vergleich IMMER true.
Und wenn in der For-Schleife an der Stelle ein True steht, läuft die Schleife weiter.
Eine gute Programmiersprache hätte Dir bei dem Typmischmasch mindestens eine Warnung, wenn nicht sogar einen Fehler geliefert.
PowerShell konvertiert leider die Type so weit es geht und lädt daher oft dazu ein, dass man die Programmfehler nicht sieht.
BTW:
while ($xOld_file.busy) {
sleep -milliseconds 500
}das ist übrigens eine herrliche Grundlage für eine Endlosschleife. Was passiert, wenn die von Dir gewünschte Datei $xOld_file aus irgendeinem Grund, den Du nicht beeinflussen kannst, immer "busy" ist? Hier solltest Du einen Zähler verwenden und noch einer bestimmten Anzahl das Programm abbrechen.
Grüße aus Berlin schickt Robert
MVP Exchange Server -
Du befüllst deine Variable $xTimes mit einem Binären vergleich!
Das heist, deine Variable $xTimes wird immer nur $True oder $False enthalten!Dann erzeugst du eine For-Zählschleife und vergleichst den Integer Wert $x mit dem Booleschen Wert $xTimes!
Das macht keinen Sinn! Deshalb wird die Abbruch Bedingung nicht erreicht!Welche Programmiererfahrung hast du?
Dein Code sieht nicht sehr „PowerShellisch“ aus!
In der PowerShell holt man sich die Zeit und das Datum mit Get-DateTime
Die Stunde kann man mit der folgenden Zeile auslesen:(Get-Date).Hour
Da PowerShell eine Dynamische („Typlose“) Sprache ist, werden Typen automatisch gecasted!
Ein explizites .ToString() ist in PowerShell (fast) nie nötig !
#Ein einfaches (Get-Date).Hour -eq 8 reicht hier also! (Get-Date).Hour -eq 8 # ergibt $True oder $False!
Man sollten den Schleifenzähler ($x++) nicht in eine If-Bedingung verpacken!
Das führt fast immer dazu, das der Zähler nicht zählt oder nicht genug zählt, so das eine Abbruch Bedingung niemals erreicht wird.
Das führt ebenfalls zu endlos schleifen.
Besser ist es den Schleifenzähler in den Kopf der Schleife zu belassen!
for($x=1; $x -le 10; $x++) { $x }
Ein „clear-variable x* -scope global“ ist unnötig wenn man, wie in dem Beispiel hier gezeigt, die Variable IMMER in der For-Schleife richtig Initialisiert (($x=0) !
Gib mal in deiner PowerShell folgenden Befehle ein:
Get-help about_For
Wenn man seine Funktion replace nennt kann man leicht mit dem PowerShell –replace durcheinander kommen! MyReplace als Name wäre da besser!
(nur so als Vorschlag ;-))
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '- Bearbeitet Peter Kriegel Sonntag, 22. Juli 2012 15:43
-
Hallo,
Danke für Ihre Antworten!
Ja sicherlich brauche ich auch ein 'Break'. Aber wie. Ich kann den Router nicht so einfach abstellen.
Sont läft er ins Nimmerwiedersehen.
Weiters: $i....
Oder: Ein [Int] devor geben => [System.DateTime]::Now.Hour.ToString()
Ich habe es schon Versucht: aber da komme ich auch nicht mehr aus der Schleife Heraus.
Es sollte eine demo werden: Wie lange braucht ein Router um eine verbindung in Kürzester Zeit,
um eine verbinding Aufzubauen. Normalerweise braucht ein Router nicht ganz 4 Minuten.
Jetzt bin ich auf ungefär bei 30 Sekunden.
1. Model:
http://www.youtube.com/watch?v=SsXGrqIcTiw&feature=channel&list=UL
2. Model:
http://www.youtube.com/watch?v=wMiZykzVGLw&feature=channel&list=UL
Der 1. Scripte war:
cls Set-ExecutionPolicy RemoteSigned $errorActionPreference = 'SilentlyContinue' $wget = 'C:\NouveauBAO\wget.exe' $tmp = 'C:\NouveauBAO\tmp.txt' $Old_file = 'C:\NouveauBAO\arenas.bat' $New_file = 'C:\NouveauBAO\arenas1.bat' $WorkFile = 'C:\NouveauBAO\batcharenas.bat' $env:path += ";C:\NouveauBAO" $i = 10 # replacement by times (to run...) function replace { (Get-Content $Old_file) | % { $_ -replace 'wget.exe', $wget` -replace 'tmp.txt', $tmp } | Set-Content $New_file -Force remove-item $Old_file -Force Rename-Item $New_file $Old_file -Force } for ($i; $i -le 10; $i ++ ) { # Get-ChildItem C:\NouveauBAO -include $Old_file -recurse | ? { -not $($(Get-Content $_) -match “C:\NouveauBAO\wget.exe”) } if ($Old_file -notcontains 'C:\NouveauBAO\wget.exe'){replace} try {C:\windows\system32\cmd.exe /c $WorkFile; $i} # try {start-process "cmd.exe" "/c $WorkFile"} catch { $_.Exception.Message } while ($Old_file.busy) { sleep -milliseconds 500 } }
Mit freundlichen Grüßen
Arnold
-
Ich habe mir die Videos angesehen und verstehe nichts ausser musik!
Von welcher Seite (URL) hast du denn den Code und die Batch files?Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' ' -
Hallo Arnold,
ist der Thread noch aktuell?
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. -
G Morgen,
Wegen Gesundheiltichen probleme konnte ich nicht sofort Antworten.
Den Batch-scripte habe nur ich.
Der scripte Beinhaltet 30 links. Siehe 1. Aufzeichnung. Alle kommen nicht durch.
Darum gibt es Fehlmeldungen. Mit der 2. version unterdrücke ich die Fehlmeldungen mit:
" $errorActionPreference = 'SilentlyContinue' "
So Weit ok, aber ich komme immer noch nicht aus der Schleife heraus.
Liegt das am Batch-file?
-
Moin,
Der scripte Beinhaltet 30 links. Siehe 1. Aufzeichnung. Alle kommen nicht durch.
Darum gibt es Fehlmeldungen. Mit der 2. version unterdrücke ich die Fehlmeldungen mit:
" $errorActionPreference = 'SilentlyContinue' "na ja, Fehler sind nicht da, um unterdrückt zu werden.
Würdest Du die Fehler nicht unterdrücken, würde die PowerShell z.B. an dieser Stelle "$xi ++" eine Fehlermeldung und einen Abbruch bringen.
Dadurch, dass Du den Fehler unterdrückst, geht das Script einfach weiter.
So Weit ok, aber ich komme immer noch nicht aus der Schleife heraus.
Das haben Dir Peter und ich ja ausführlich erklärt: Du würfest Variablentypen durcheinander und doe Abbruchbedingung kann daher nie erfüllt werden.
Da zumindest ich schon gar nicht verstehe, wass Du mit dem Script überhaupt machen willst (z.B. was genau diese vielen, merkwürdigen [System.DateTime]::Now.Hour.ToString() Vergleiche - die eh nicht funktionieren - erreichen sollen), ist es auch schwer, zu helfen.
Wir können Dir nur sagen, was falsch ist.
Grüße aus Berlin schickt Robert
MVP Exchange Server- Als Antwort markiert arnold_ Sonntag, 29. Juli 2012 20:05
-
Danke,
Ich werde es noch mals Überarbeiten.
ps:
Mit dem scripte wollte ich nur wissen, wie viele reconnextion ich in einer gewissen Zeitabschnitte bekomme.
Arnold