Läuft Anwedung aus dem Pfad?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Läuft Anwedung aus dem Pfad?

    Vielleicht könnt ihr mir weiter helfen.

    Wie kann ich am besten überprüfen, ob eine Anwendung aus einem bestimmten Pfad ausgeführt wird?
    Z.b. Ob der Prozess aus dem Pfad F:\Dedicated\run.exe läuft oder nicht.

    So kann ich ja nur allgemein nach den Prozess Namen fragen :/

    VB.NET-Quellcode

    1. Dim processes() As System.Diagnostics.Process = System.Diagnostics.Process.GetProcessesByName("run")
    2. If processes.Length > 0 Then
    3. MsgBox("Läuft")
    4. Else
    5. End If

    Und in processes(0).MainModule.FileName steht der vollständige Pfad für den ersten zutreffenden Prozess drin. Den Rest bekommst Du zweifellos selber hin ;)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Dim Process As New Process(): ist Blödsinn, kann weg.
    On Error Resume Next: HimmelHilf! Wozu? Weg damit.

    Du gehst ja jetzt in Deiner ForEach-Schleife alle Prozesse durch, die den Namen run haben. Das heißt, dass in Process bei jedem Schleifendurchgang ein anderer Prozess drinsteckt, der die Bedingung erfüllt, also run heißt. Und wenn Du Dir eben in p.Text (was immer auch p ist ?( ) Process.MainModule.FileName anzeigen lässt, dann wird bei jedem Schleifendurchgang der komplette Dateipfad von diesem Prozess da reingesteckt.
    Ein Beispiel:
    Es laufen 5 Prozesse:
    • run.exe aus dem Verzeichnis C:\Foo
    • svchost.exe aus C:\Windows
    • explorer.exe aus C:\Windows
    • Dummy.exe aus D:\Bar
    • run.exe aus F:\1\2\3
    Dann werden nacheinander in Deiner For-Schleife erst der 1., dann der 5. Prozess durchgenommen. Die anderen heißen ja nicht run.exe, daher werden sie ignoriert.
    Im ersten Schleifendurchlauf wird dann also in p.text eben C:\Foo\run.exe reingeschrieben und danach im 2. Durchlauf (der wenige Millisekunden danach gleich erfolgt) in p.text F:\1\2\3\run.exe reingeschrieben. Da das allerdings sehr schnell passiert, siehst Du am Ende nur in p.Text das F:\1\2\3\run.exe, weil das davor ja supifix überschrieben wird.

    Und wie Du jetzt rausfindest, ob die Datei run.exe eben aus einem bestimmten Verzeichnis gestartet wurde? Nach über 700 Posts kann man wohl davon ausgehen, dass Stringvergleiche zwischen Process.MainModule.FileName und dem, was Du vorgibst, jetzt echt kein Problem sein sollten. Später kannst Du Dir auch etwas sauberer mit IO.Path den Verzeichnisnamen selber extrahieren.

    ##########

    @Pixxxas: Noch ne zusätzliche Frage: Was bekommst Du als Ergebnis und welches Ergebnis erwartest Du? Bitte solch eine Antwort:
    Es steht F:\1\2\3\run.exe in p.text, aber eigentlich will ich dass … drinsteht.

    oder
    Es steht F:\1\2\3\run.exe in p.text, aber eigentlich will ich dass mein Computer einen Neustart macht.

    oder
    Es steht F:\1\2\3\run.exe in p.text, aber eigentlich will ich dass automatisch eine Pizza Salami bestellt wird.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Danke für dein Beitrag.
    Ich denke das wissen und können, kann man nicht anhand der Beiträge beurteilen, ich Programmiere nur ab und zu ein bisschen.

    p.text ist ein Lable, in dem mir der Pfad angezeigt wird. Leider bin ich nicht schlauer geworden und hab nicht rausgefunden, wie ich die überprüfung machen kann.
    Dann beantworte bitte konkret die Zusatzfrage, die ich am Ende von Post#4 gestellt habe, vielleicht kommen wir dann weiter.

    ##########

    Kurze Beispiele für String-(Teil)Vergleiche (absolutes Grundlagenwissen!!!):

    VB.NET-Quellcode

    1. Dim a = "Hallo"
    2. Dim b = "Welt"
    3. Dim c = "Hallo Welt"
    4. If a = b Then MessageBox.Show("gleich") 'wird NICHT angezeigt, da a = "Hallo" und b = "Welt"
    5. If a & b = c Then MessageBox.Show("gleich") 'wird NICHT angezeigt, da a & b = "HalloWelt", aber c = "Hallo Welt"
    6. If a & " " & b = c Then MessageBox.Show("gleich") 'wird angezeigt, da a & " " & b = "Hallo Welt" und c ebenfalls
    7. If c.Contains(a) Then MessageBox.Show("enthalten") 'wird angezeigt, da a (Hallo) in c ("Hallo Welt") drinsteckt
    8. If c.Contains(b) Then MessageBox.Show("enthalten") 'wird angezeigt, da b (Welt) in c ("Hallo Welt") drinsteckt
    9. If c.Contains(a & b) Then MessageBox.Show("enthalten") 'wird NICHT angezeigt, da a & b zusammengesteckt (HalloWelt) so nicht in c ("Hallo Welt") drin sind
    10. If a.Contains(c) Then MessageBox.Show("enthalten") 'wird NICHT angezeigt, da c ("Hallo Welt") nicht in a ("Hallo") drinsteckt


    Wenn Du es damit nicht hinbekommst, dann sind Hopfen und Malz verloren. Und es wird keinen Wodka als Ersatz geben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    @Pixxxas

    Ich denke die Antworten helfen Dir alle nichts, da Du womöglich nur wissen möchtest ob die eigene Anwendung aus einem bestimmten Pfad gestartet wurde.

    Ich hab das bei mir so gemacht:

    VB.NET-Quellcode

    1. If System.AppDomain.CurrentDomain.BaseDirectory.ToUpper <> "C:\BONITFLEXXPRO\" And Not System.AppDomain.CurrentDomain.BaseDirectory.ToUpper.Contains("\DEBUG") Then
    2. Dim erg As DialogResult = Messagebox("ACHTUNG: BONit FlexX PRO darf ausschließlich aus dem Ordner C:\BONitFlexXPRO\ gestartet werden (direkt oder per Verknüpfung).", ".EXE Datei liegt in falschem Ordner", MessageBoxButtons.OK, MessageBoxIcon.Stop)
    3. End
    4. End If


    Zur Erklärung: Ich prüfe nicht nur ob der Pfad "c:\BONitflexxpro\" enthält, sondern auch "\Debug". Deswegen, damit beim Starten aus der VB.NET IDE keine Meldung gebracht wird.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @Pixxxas An welchen Werten machst Du denn das fest?
    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!
    Genau das ist ja mein Problem, ich hab keine Ahnung.
    Wie ich einen normalen Prozess überprüfen kann, das ist klar, aber nicht wie ich speziell einen bestimmten Prozess prüfen kann, der nur aus einem bestimmten Pfad kommt, ob erläuft, das weiß ich nicht.

    Der Pfad der exe, die überprüft werden soll, ist selbst im Programm hinterlegt.

    So würde es gehen, aber mir ist klar, dass das absolute Scheiße ist.

    VB.NET-Quellcode

    1. Dim Process As New Process()
    2. For Each Process In Process.GetProcessesByName("run")
    3. On Error Resume Next
    4. run.Text = Process.MainModule.FileName
    5. Next
    6. root.Text = install.Text & "run.exe"
    7. If run.Text = root.Text Then
    8. Label4.Text = "Server is running..."
    9. Else
    10. Label4.Text = "wait for Server..."
    11. End If


    run.Text = zieh ich mir den Pfad von dem Prozess run.exe
    root.Text = ist der vordefinierte Pfad von wo run.exe gestartet werden soll/muss

    Dann vergleiche ich beide Pfade / Texte, ob sie gleich sind. Wenn ja, dann... Wenn nicht, dann...
    @Pixxxas Kann es sein, dass Du beratungsresistent bist?
    Sieh Dir mal an, was @VaporiZed in Post 4 geschrieben hat.
    ====
    Hast Du da mal nen Breakpunkt drauf gesetzt und Dir den Inhalt der Variablen angesehen?
    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!
    @Pixxxas Ich frage mich, wo da das Problem ist:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private MyProcess As Process
    3. Private MyPath As String = "D:\Projekte\Helper\Wecker.exe"
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. MyProcess = Process.Start(MyPath)
    6. End Sub
    7. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    8. Label1.Text = MyProcess.MainModule.FileName
    9. If String.Compare(MyProcess.MainModule.FileName, MyPath, True) = 0 Then
    10. MessageBox.Show("gefunden")
    11. End If
    12. End Sub
    13. End Class
    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!
    Sorry, aber niveautechnisch fühl ich mich gerade in der Situation, als ob jemand fragt:
    Ich hab die Gleichung x + 4 = 9. Kann mir jemand sagen, welchen Wert x hat?
    Ich weiß, ich muss nicht posten, wenn's mich stresst, aber wer A sagt, muss auch phasie sagen …
    Trotzdem gibt's von mir keine Lösung, sondern nur ne Hilfe.

    Pixxxas schrieb:

    So würde es gehen, aber mir ist klar, dass das absolute Scheiße ist.
    Warum ist der beschissen? Weil er nicht beachtet, was in Post#4 steckt. Wenn Du mehrere Prozesse mit dem Namen hast, wird durch Deinen Code durch das dauernde Überschreiben immer nur der allerletzte Prozess aus der For-Schleife zum Vergleich hergenommen. Probier es mal so, um dann hoffentlich zu erkennen, was ich meine:
    Pack Dir eine (breite) ListBox auf das Form. Und dann dieser Code statt Deinem:

    VB.NET-Quellcode

    1. ListBox1.Items.Clear()
    2. Dim Process As Process 'KEIN NEW!!!
    3. For Each Process In Process.GetProcessesByName("run")
    4. Try 'KEIN ON ERROR!
    5. ListBox1.Items.Add(Process.MainModule.FileName)
    6. Catch UAEx As UnauthorizedAccessException
    7. ListBox1.Items.Add("(Prozess nicht zugänglich)")
    8. End Try
    9. Next

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Pixxxas Erweiterte Antwort => Dateianhänge => Hochladen
    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!