"Programme" <- verzeichnis-link durch reales verzeichnis "program files" ersetzen.

  • ich habe ein string/pfad vergleichs problem.
    wenn ich mir den pfad eines prozesses zurückgeben (funktion) lasse, erhalte ich z.B.
    C:\Programme\Steam\steamapps\common\Call of Duty 4\
    diesen string vergleiche ich mit dem hinterlegten regkeypfad, der aber wiederum so aussieht:
    c:\program files\steam\SteamApps\common\call of duty 4\

    das programm ist also vorhanden bzw installiert, aber mein stringvergleich schlägt fehl, da
    ich immer den link zum verzeichnis der "program files" bekomme... d.h.
    je nach sprache kann das auch "programmi" / "programme" / "programma" oder wie auch immer sein.

    deswegen suche ich eine automatisierbare möglichkeit rauszubekommen wie bei unterschiedlichen
    sprachen dieser link ins programm-verzeichnis heisst um in dann zu ersetzen und vergleichen zu können.

    ich hoffe, dass ich ihr versteht, was ich meine...

    hat jemand eine idee wie ich das hin bekomme ?

    EDIT: hier mal als script-beispiel-problem:
    $path und $reg sind nicht beeinflussbar und hier nur beispielhaft vorgegeben!

    [autoit]


    $path = "C:\Programme\Steam\steamapps\common\Call of Duty 4\"
    $reg = "c:\program files\steam\SteamApps\common\call of duty 4\"
    if StringLower($path) = StringLower($reg) then msgbox(0, "ok", "das spiel ist installiert")

    [/autoit][autoit][/autoit][autoit]

    ;lösungsansatz:
    if StringInStr($path, "Programme") then StringReplace($path, "Programme", "program files")
    ;nur das "Programme" hier immer mit dem verzeichnis-link der jeweiligen sprache ersetzt werden muss.

    [/autoit]

    6 Mal editiert, zuletzt von WhiteLion (24. Oktober 2011 um 19:23)

  • Hallo,

    Ich würd es ja damit versuchen:

    [autoit]

    @ProgramFilesDir

    [/autoit]

    also beispielsweise:

    [autoit]

    $path = @ProgramFilesDir & "\Steam\steamapps\common\Call of Duty 4\"
    $reg = @ProgramFilesDir & "\steam\steamapps\common\call of duty 4\"
    if StringLower($path) = StringLower($reg) then msgbox(0, "ok", "das spiel ist installiert")

    [/autoit]

    Edit:
    Damit sparst du dir auch das Ersetzen des "Programme-Ordner-Namens"

  • Mit dem Auslesen der Registry ist das aber so ne Sache für sich.

    Ich hab mir zB nen Serverjoiner gebaut. Da wollt ich dann prüfen, ob das Game auch installiert ist und wenn nicht, den entsprechenden Join-Button deaktivieren.
    Allerdings musste ich feststellen, dass je nach OS und @Arch die Pfade in der Registry viel zu unterschiedlich sind.
    Sicher, man könnte dann mit ner Select-Case-Abfrage die verschiedensten Varianten durchgehen und dann die Variablen entsprechend setzen, aber das war mir zu aufwendig.

    Weiss zwar nicht, was WhiteLion hier coden will, aber ich geh mal davon aus, dass er mit dem Auslesen der Registry auf das gleiche Problem stoßen wird.

  • Moin,

    also, eigentlich gibt es dazu die Umgebungsvariablen - mach mal eine DOS-Box auf (Start-Ausführen-CMD) und gib

    set programf

    ein.

    Je nach System zeigt er dir den Inhalt der Variablen

    %ProgramFiles%

    und

    %ProgramFiles(x86) %

    an.
    %ProgamFiles% gibt es unter Windows immer, %ProgramFiles(x86) % nur auf 64 Bit Systemen.
    Steam ist normalerweise immer unter %ProgramFiles(x86) % installiert - aber das kann der Benutzer anpassen.

    Ich habe den Steam-Ordner z.B. auf eine andere Festplatte verschoben (Dann einem die Steam.exe starten und der Umzug ist Perfekt).

    Willst du wissen ob ein Programm installiert ist - hier also "Call of Duty 4", solltest du die Registry fragen ob das Programm an sich installiert ist, zu finden unter

    HKEY_LOCAL_MACHINE\SOFTWARE\WoW6432Node\Microsoft\Windows\CurrentVersion\Unistall\Steam App xxxxxx (64Bit Systeme)
    oder
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Unistall\Steam App xxxxxx (32Bit Systeme)

    Das funktioniert natürlich nur, wenn das Programm über Steam kommt. Wenn nicht wird es direkte Einträge unterhalb von "Uninstall" haben.
    Alternativ schaust du in die Einstellungen des Programm selber unter
    HKEY_LOCAL_MACHINE\SOFTWARE\WoW6432Node bzw. HKEY_LOCAL_MACHINE\SOFTWARE\WoW6432Node

    Ohne vergleiche geht es also nicht - ich schreibe öfters Programme die die Registry manipulieren etc. - und die Prüfung auf 32/64 Bit ist dabei leider obligatorisch.

    Sonst prüfe doch entweder auf einen teil des Pfades (nur blöd wenn der Benutzer dank einer NICHT-Steam Version einen völlig anderen Namen nehmen konnte) oder nimm die Exe-Datei selber (den prozess sucht du dir ja scheinbar schon raus) und frage bei dieser eines der Werte ab die du unter Details findest wenn du die Eigenschaften der Exe aufrufst.

    BLinz(ler)

  • danke für die zahlreichen antworten und bemühungen :)
    ich hab die erste lösung verwendet... auch wenn ich es erst gerne so gehabt hätte wie gefragt ... :D
    es hat zumindest einfach und den zweck erfüllt.

    im moment arbeite ich gerade an einer übersetzung eines php-scriptes für gamestats... falls jemand diesbezüglich noch autoit-lösungen kennt... :D