none
Schleife geht nicht RRS feed

  • 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

    Sonntag, 22. Juli 2012 12:48

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
    Sonntag, 29. Juli 2012 12:41
  • 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


    • Als Antwort markiert arnold_ Sonntag, 29. Juli 2012 20:04
    • Bearbeitet arnold_ Sonntag, 29. Juli 2012 20:05
    Sonntag, 29. Juli 2012 20:04

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
    Sonntag, 22. Juli 2012 15:11
  • 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' '


    Sonntag, 22. Juli 2012 15:42
  • 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

    Sonntag, 22. Juli 2012 19:35
  • 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' '

    Montag, 23. Juli 2012 15:42
  • 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?

    Sonntag, 29. Juli 2012 11:15
  • 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
    Sonntag, 29. Juli 2012 12:41
  • 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


    • Als Antwort markiert arnold_ Sonntag, 29. Juli 2012 20:04
    • Bearbeitet arnold_ Sonntag, 29. Juli 2012 20:05
    Sonntag, 29. Juli 2012 20:04