Installationspfad mit Batch aus der Registry auslesen unter Windows 7

Wieder was gelernt. Wie liest man clever und zuverlässig den korrekten Installationspfad eines Programms aus der Registry? Nicht so wie ich bis jetzt…

Unter Windows XP habe ich den Pfad mit folgendem Befehl aus der Registry ausgelesen:

for /f "tokens=2* delims=	" %%a in ('reg query "HKLM\SOFTWARE\SPSS\SPSS Statistics\17.0\Setup" /v "Directory"') do set "pfad17=%%b"

Hinter delims habe ich mit [Alt]+[0] [9] ein TAB als Delimiter angegeben. Why?
Der Output von

reg query "HKLM\SOFTWARE\SPSS\SPSS Statistics\17.0\Setup" /v "Directory"

ist:

So bekomme ich mit dieser Codezeile also den Pfad von der Installation gespeichert. Aber nicht in Windows 7!

Und das hatte mich doch tatsächlich ne kurze Zeit von Arbeit abgehalten.

Der selbe Befehl unter Windows 7 rührt die Variable nicht einmal an.

set pfad17=xy
for /f "tokens=2* delims=	" %%a in ('reg query "HKLM\SOFTWARE\SPSS\SPSS Statistics\17.0\Setup" /v "Directory"') do set "pfad17=%%b"

Der Inhalt der Variable wäre unter Windows 7: „xy“.
Obwohl

reg query "HKLM\SOFTWARE\SPSS\SPSS Statistics\17.0\Setup" /v "Directory"

unverändert den korrekten Regkey anzeigt.

Was sich verändert hat ist die Verarbeitung von

for

.
Wird for als Delimiter kein Wert übergeben so werden die Standardtrennzeichen Leerzeichen oder Tab genutzt. Wird ein anderes Trennzeichen angegeben so ersetzt dieses die Standardtrennzeichen. Dass ich als als Trennzeichen das Tab explizit angegeben habe ist also sinnlos, unter Windows XP funktionieren beide Varianten. Unter Windows 7 funktioniert nur eine Variante, die den korrekten Gebrauch von for Delimitern folgt.

Fazit:

Windows XP:
Funktioniert und auch zu Windows 7 kompatibel.

for /f "tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\SPSS\SPSS Statistics\17.0\Setup" /v "Directory"') do set "pfad17=%%b"

Der Code funktioniert zwar unter Windows XP, ist aber nicht kompatibel zu Windows 7 (wahrscheinlich auch Vista) aufgrund der unsauberen Verwendung (Angabe) von Tab als Delimiter.

for /f "tokens=2* delims=	" %%a in ('reg query "HKLM\SOFTWARE\SPSS\SPSS Statistics\17.0\Setup" /v "Directory"') do set "pfad17=%%b"

Windows 7:
Funktioniert nicht mehr, die Zeile wird ignoriert.

for /f "tokens=2* delims=	" %%a in ('reg query "HKLM\SOFTWARE\SPSS\SPSS Statistics\17.0\Setup" /v "Directory"') do set "pfad17=%%b"

Funktioniert, wie auch bei Windows XP.

for /f "tokens=2* delims=	" %%a in ('reg query "HKLM\SOFTWARE\SPSS\SPSS Statistics\17.0\Setup" /v "Directory"') do set "pfad17=%%b"

Ich glaube den eigentlichen Punkt des Posts hätt ich in 2 Zeilen übermitteln können… kurz fassen muss ich noch lernen -.-
Zumindest hat es jetzt jeder Volldepp gepeilt, oder? 😛

4 Kommentare

  1. Ui, ein Batch-Nutzer! Cool! Ich nutze das auch unheimlich gerne noch aus Gewöhnung und Begabung, da ich das seit DOS-Zeiten so mache, und für mich Batch unter Windows-NT (2000, XP, 7) schon komfortabel.

    So ganz kann ich den Sinn für mich persönlich zwar noch nicht erkennen, ich werde mir das aber gleich mal als Schnippsel speichern, falls mich der Installationspfad eines Programms mal interessieren sollte. Ist ja durchaus vorstellbar.

    Lohnt doch immer mal wieder hier vorbeizusehen, Danke für den Post!

    Hoffentlich habe ich aber bald Mal Zeit für die Powershell….

  2. Wenn du in die Suchleiste hier im Blog mal „Batch“ eingibst wirste noch einiges finden 😉

    Installationspfad von Programmen ist (zumindest hier auf Arbeit) ne total wichtige Sache.
    Man kennt den Pfad, wo ein Programm installiert ist, eher selten oder bei 120 PCs kommt es auch vor, dass der Pfad nicht auf jedem PC gleich ist. So würde das Script mit einem fest eingegebenen Pfad („C:/Programme/bla“) auf einigen PCs nicht funktionieren und wichtige Routinen würden versagen.

  3. Hallo Hannes,

    das gleiche Prob habe ich mit diesem Script. Dennoch bringe ich es trotz deinem Tipp unter W7 nicht zum laufen. Was mache ich denn Falsch?

    @echo off &setlocal
    >“printers.txt“ (
    for /f „delims=“ %%i in (
    ‚reg query „HKLM\SYSTEM\CurrentControlSet\Control\Print\Printers“^|findstr /rxc:“..*\\Printers\\..*“‚
    ) do (
    for /f „tokens=2*“ %%j in (
    ‚reg query „%%i“ /v Port^|findstr /c:“IP_“‚
    ) do (
    set „printer=%%~nxi“
    set „port=%%k“
    setlocal EnableDelayedExpansion
    echo !port!|findstr /bc:“IP_“ >nul && echo „!printer!“ „!port!“
    endlocal
    )
    )
    )

    1. Hallo Alex,
      was versuchst du denn mit diesem Script konkret zu erreichen?
      Ich sehe etwas von Drucker auslesen, schauen ob im Port-String jedes Druckers „IP_“ vorhanden ist und dann überprüfst du irgendwie nochmal den Port-String auf „IP_“?
      Was genau soll passieren?
      Und was genau ist die Fehlermeldung? An welcher Zeile bleibt Batch hängen?
      LG

Schreibe einen Kommentar