2 For Schleifen gleichzeitig

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    2 For Schleifen gleichzeitig

    Hey,

    ich stehe vor einem kleinen Problem..

    Ich habe 2 For Schleifen.
    Eine geht durch alle Ordner im Startordner und speichert den Namen jeweils dann in einem String (Zeile für Zeile).
    Die zweite Schleife geht durch alle aktiven Fensternamen und speichert diese dann auch in einem String (Auch hier: Für jeden Fensternamen eine neue Zeile)

    Das ganze sieht so aus:

    VB.NET-Quellcode

    1. Dim Folders As String
    2. For Each Dir As String In System.IO.Directory.GetDirectories(My.Computer.FileSystem.CurrentDirectory & "\Data\")
    3. Dim dirInfo As New System.IO.DirectoryInfo(Dir)
    4. Folders = Folders & dirInfo.Name & "~"
    5. Next
    6. Dim str As String() = Folders.Split("~")
    7. For Each s As String In str
    8. 's ist jedes mal der nächste Ordner dann
    9. Next
    10. Dim p As Process
    11. Dim Windows As String
    12. For Each p In Process.GetProcesses
    13. Windows = Windows & vbNewLine & p.MainWindowTitle.ToString
    14. Next
    15. Windows = LineTrim(Windows)
    16. Dim Ar() As String = Split(Windows, Environment.NewLine)
    17. For Each sX As String In Ar
    18. 'sX ist dann immer ein Fenstername
    19. Next



    Was ich nun erreichen möchte:
    Abfragen ob ein Spezielles Fenster schon existiert, in dessen Name dann einer dieser Ordner vorkommt.
    Das Fenster heißt sowas wie "Gesuchtes Fenster - (Hier einer der Ordnernamen)".

    Falls das Fenster nicht gefunden wurde, dann soll es erstellt werden, das ist aber nicht das Problem.
    Habe schon einiges probiert, aber alles endet darin, dass diese Fenstererstellung gespammed wird.

    Das ist einer der Versuche mit kompletten Code, von dem, was ich vorhabe:

    VB.NET-Quellcode

    1. Dim Folders As String
    2. For Each Dir As String In System.IO.Directory.GetDirectories(My.Computer.FileSystem.CurrentDirectory & "\Data\")
    3. Dim dirInfo As New System.IO.DirectoryInfo(Dir)
    4. Folders = Folders & dirInfo.Name & "~"
    5. Next
    6. Dim str As String() = Folders.Split("~")
    7. For Each s As String In str
    8. 'Console.WriteLine(s)
    9. If (My.Computer.FileSystem.FileExists(My.Computer.FileSystem.CurrentDirectory & "\Data\" & s & "\" & "Status.txt")) Then
    10. Dim StartTime As String = Inireader.WertLesen("Settings", "StartTime", My.Computer.FileSystem.CurrentDirectory & "\Data\" & s & "\Time.ini")
    11. Dim StopTime As String = Inireader.WertLesen("Settings", "StopTime", My.Computer.FileSystem.CurrentDirectory & "\Data\" & s & "\Time.ini")
    12. If (IsInTime(StartTime, StopTime) = True) Then
    13. Log("X2")
    14. Dim p As Process
    15. Dim Windows As String
    16. For Each p In Process.GetProcesses
    17. Windows = Windows & vbNewLine & p.MainWindowTitle.ToString
    18. Next
    19. Windows = LineTrim(Windows)
    20. Dim Ar() As String = Split(Windows, Environment.NewLine)
    21. For Each sX As String In Ar
    22. If sX.ToString.Contains(s & " - python " & My.Computer.FileSystem.CurrentDirectory & "\Data\" & s & "\" & s & ".py") Then ''''FEHLER
    23. Else
    24. Dim Path = My.Computer.FileSystem.CurrentDirectory & "\Data\" & s & "\" & s & ".py"
    25. Dim startInfo As New ProcessStartInfo
    26. startInfo.FileName = "cmd.exe"
    27. startInfo.Arguments = "/k " & "title " & s & " & python " & Path
    28. startInfo.WorkingDirectory = My.Computer.FileSystem.CurrentDirectory & "\Data\" & s & "\"
    29. Process.Start(startInfo)
    30. End If
    31. Next
    32. End If
    33. End If
    34. Next



    Kann mir wer auf die Sprünge helfen?
    Danke :)
    Lg


    Meine Website:
    www.renebischof.de

    Meine erste App (Android):
    PartyPalooza

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xored“ ()

    die Folders und Windows je in einen String zu füllen ist natürlich ein untauglicher Ansatz.
    Nimm stattdessen Folders als String-Array ( wies ja bereits vorliegt), bzw und Windows als List(Of String).
    Dann kann folgende Function dir die Folder-Namen zurückliefern, auf die deine komische Bedingung zutrifft:

    VB.NET-Quellcode

    1. 'returnt eine Liste der folderNamen, auf die diese komische Bedingung zutrifft
    2. Private Function GetWindowFolders(folders As IEnumerable(Of String), windows As IEnumerable(Of String)) As List(Of String)
    3. ' If sX.ToString.Contains(s & " - python " & My.Computer.FileSystem.CurrentDirectory & "\Data\" & s & "\" & s & ".py")
    4. Dim condition As Func(Of String, String, Boolean) =
    5. Function(folder, win) win.Contains(folder & " - python " & My.Computer.FileSystem.CurrentDirectory & "\Data\" & folder & "\" & folder & ".py")
    6. Return folders.Where(Function(folder) windows.Any(Function(win) condition(folder, win))).ToList
    7. End Function
    Übrigens wie immer: Benamung fundamental wichtig. Mit Namen wie s, sX kann man beim Code-Entwickeln kaum den Überblick behalten - was ein Folder- und was ein Window-Name ist.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Danke erstmal :)

    Benutze es aber noch falsch.
    Möchte erstmal alle Ordnernamen ausgeben, auf die diese Bedinung zutrifft.

    Das klappt auch:

    VB.NET-Quellcode

    1. For Each Folder In GetWindowFolders(FolderList, WindowList)
    2. Console.WriteLine(Folder)
    3. Next


    Nun möchte ich, dass er aber nur die Ordner anzeigt, auf die diese Condition nicht zutrifft. Wo muss das Not hin in der GetWindowFolders Funktion? :D

    VB.NET-Quellcode

    1. Private Function GetWindowFolders(ByVal folders As IEnumerable(Of String), ByVal windows As IEnumerable(Of String)) As List(Of String)
    2. ' If sX.ToString.Contains(s & " - python " & My.Computer.FileSystem.CurrentDirectory & "\Data\" & s & "\" & s & ".py")
    3. Dim condition As Func(Of String, String, Boolean) =
    4. Function(folder, win) win.Contains(folder & " - python " & My.Computer.FileSystem.CurrentDirectory & "\Data\" & folder & "\" & folder & ".py")
    5. Return folders.Where(Function(folder) windows.Any(Function(win) condition(folder, win))).ToList
    6. End Function
    7. Function Test()
    8. Dim Folders As String
    9. For Each Dir As String In System.IO.Directory.GetDirectories(My.Computer.FileSystem.CurrentDirectory & "\Data\")
    10. Dim dirInfo As New System.IO.DirectoryInfo(Dir)
    11. Folders = Folders & dirInfo.Name & "~"
    12. Next
    13. Dim FolderList() As String = Folders.Split("~")
    14. Dim p As Process
    15. Dim Windows As String
    16. For Each p In Process.GetProcesses
    17. Windows = Windows & vbNewLine & p.MainWindowTitle.ToString
    18. Next
    19. Windows = LineTrim(Windows)
    20. Dim WindowList() As String = Split(Windows, Environment.NewLine)
    21. For Each Folder In GetWindowFolders(FolderList, WindowList)
    22. Console.WriteLine(Folder)
    23. Next
    24. End Function


    Mfg. :)



    Edit: Nevermind, habe es gefixt, danke dir :)


    Meine Website:
    www.renebischof.de

    Meine erste App (Android):
    PartyPalooza

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „xored“ ()

    xored schrieb:

    statt Den Ordner wo die Bedienung zutrifft
    Bist Du sicher, dass die Bedingung korrekt formuliert ist?
    Gib zunächst mal alle Namen aus und probier dann, die Bedingung schärfer zu formulieren, bis dann nur noch Deine Zielordner übrig bleiben.
    Besser ist es wohl, da keinen Einzeiler zu verwenden:

    VB.NET-Quellcode

    1. Return folders.Where(Function(folder) windows.Any(Function(win) condition(folder, win))).ToList
    sondern das in einer debug-baren Prozedur auszuformulieren.
    Zum Debuggen allgemein gugst Du hier: Debuggen, Fehler finden und beseitigen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Habs doch schon gefixt :)

    Das ist der gesamte Code:

    VB.NET-Quellcode

    1. Private Function GetWindowFolders(ByVal folders As IEnumerable(Of String), ByVal windows As IEnumerable(Of String)) As List(Of String)
    2. Dim condition As Func(Of String, String, Boolean) =
    3. Function(folder, win) win.Contains(folder & " - python " & My.Computer.FileSystem.CurrentDirectory & "\Data\" & folder & "\" & folder & ".py")
    4. Return folders.Where(Function(folder) Not windows.Any(Function(win) condition(folder, win))).ToList
    5. End Function
    6. Function StartAllClientsInTime()
    7. Dim Folders As String
    8. Dim FoldersFinished As String
    9. For Each Dir As String In System.IO.Directory.GetDirectories(My.Computer.FileSystem.CurrentDirectory & "\Data\")
    10. Dim dirInfo As New System.IO.DirectoryInfo(Dir)
    11. Folders = Folders & dirInfo.Name & "~"
    12. Next
    13. Dim FolderList() As String = Folders.Split("~")
    14. Dim p As Process
    15. Dim Windows As String
    16. For Each p In Process.GetProcesses
    17. Windows = Windows & vbNewLine & p.MainWindowTitle.ToString
    18. Next
    19. Windows = LineTrim(Windows)
    20. Dim WindowList() As String = Split(Windows, Environment.NewLine)
    21. Try
    22. For Each El In GetWindowFolders(FolderList, WindowList)
    23. FoldersFinished = FoldersFinished & El & "~"
    24. Next
    25. Dim str As String() = FoldersFinished.Split("~")
    26. For Each s As String In str
    27. If (My.Computer.FileSystem.FileExists(My.Computer.FileSystem.CurrentDirectory & "\Data\" & s & "\" & "Status.txt")) Then
    28. Dim Status = My.Computer.FileSystem.ReadAllText(My.Computer.FileSystem.CurrentDirectory & "\Data\" & s & "\Status.txt")
    29. If (Status.Contains("Gestartet")) Then
    30. Dim StartTime As String = Inireader.WertLesen("Bot", "StartTime", My.Computer.FileSystem.CurrentDirectory & "\Data\" & s & "\Time.ini")
    31. Dim StopTime As String = Inireader.WertLesen("Bot", "StopTime", My.Computer.FileSystem.CurrentDirectory & "\Data\" & s & "\Time.ini")
    32. If (IsInTime(StartTime, StopTime) = True) Then
    33. Dim Path = My.Computer.FileSystem.CurrentDirectory & "\Data\" & s & "\" & s & ".py"
    34. Dim startInfo As New ProcessStartInfo
    35. startInfo.FileName = "cmd.exe"
    36. startInfo.Arguments = "/k " & "title " & s & " & python " & Path
    37. startInfo.WorkingDirectory = My.Computer.FileSystem.CurrentDirectory & "\Data\" & s & "\"
    38. Process.Start(startInfo)
    39. End If
    40. End If
    41. End If
    42. Next
    43. Catch
    44. End Try
    45. End Function


    Klappt perfekt. Habe die s Variabeln noch nicht geändert, nehme den Tipp aber an und werde das zur Übersicht ändern :)
    Danke dir! :)


    Meine Website:
    www.renebischof.de

    Meine erste App (Android):
    PartyPalooza