36539
Goto Top

Installationspfad einer Anwendung suchen auf unbekanntem PC

Hallo an Alle,

ist es möglich per Batch eine bekannte Anwendung, in meinem Falle nero.exe auf einem unbekannten Windows-PC-System zu finden und als Ergebnis das LW und den Installationspfad bis zu ../nero.exe jeweils getrennt als Variablen auszugeben?

Alle meine Versuche mit Fertig-Tools, wie z. Bsp. which.exe und fpath.exe, schlagen bei mir fehl. Sie suchen und finden generell alle nur auf LW C. Mit dem For-Befehl komme ich leider auch nicht weiter - zu wenig Erfahrung.

Danke für jede Hilfe

Gruß
Onegasee59

Content-ID: 41790

Url: https://administrator.de/contentid/41790

Ausgedruckt am: 25.11.2024 um 06:11 Uhr

Biber
Biber 09.10.2006 um 21:55:55 Uhr
Goto Top
Moin Onegasee,
endlich mal eine Frage, die ich beantworten kann:

am CMD-Prompt wären Eingabe und Output:
>for %a in (c d e f g h) do @for /f %i in ('dir /s /b %a:\nero.exe ^2^>nul') do @echo "Lw=%~di" path="%~pi"  
"Lw=c:" path="\Programme\Ahead\Nero\"  

...wobei diese Lw-Liste "c d e f g h" von Dir beliebig verkürzt/erweitert werden kann.

Im Batch jeweils 2 Prozentzeichen statt einem und statt "@echo" am Ende
"....do Set "neroLw=%%~di" & set "neropath=%%~pi"

Gruß
Biber
36539
36539 09.10.2006 um 22:52:05 Uhr
Goto Top
Danke Biber,

Man Du bist ja Genial - was habe ich mich abgeqält.
Ich muss das mit dem for-Befehl nochmals intensiver lernen.


Nochmals herzlichen Dank. face-wink

Gruß onegasee59
Biber
Biber 10.10.2006 um 10:54:21 Uhr
Goto Top
thx, Onegasee59,

zum Üben habe ich noch eine schnellere Variante für Dich:
[am CMD-Prompt]
>for /f "tokens=2 delims==% " %i in ('ftype^|find /i "nero.exe"') do @echo lw:[%~di] pfad:[%~pi]  

Der findet auf jeden Fall die "zugeordnete" Nero.exe-Installation.
Unschön daran ist, dass meistens die Pfade in der Kurzform "C:\PROGRA~1\...." dargestellt sind, was ich nicht ganz zeitgemäß und etwas unästhetisch finde.
Aber für die Programmlogik ist es sicherlich egal.

Wenn Du hier statt "@echo ....." wieder "set lw=... & set pfad=.." nimmst, passt das auch.

Gruß
Biber
36539
36539 10.10.2006 um 17:06:07 Uhr
Goto Top
Hallo Biber,

auch dafür herzlichen Dank.
Es ergaben sich gestern beim Testen (funktioniert wie gesagt tadellos) aber doch noch Fragen.
Beim Testen habe ich noch auf LW H: eine 2. Nero Installation gehabt. Das war Zufall, denn ich hatte mal das komplette Nero-Verzeichnis von C: auf H: zum testen kopiert und vergessen. Dabei fand ich aber heraus das die for-Schleife immer nur das letzte Pfadverzeichnis speichert, auch wenn es mehrere findet. Wie gesagt ist Zufall, aber was wenn jetzt jemand ein virtuelles LW hat und dort z. Bsp. zum Testen einen 2. echte Nero-Installation hat, wie kann ich virtuelle LW auschließen?

Konkrete Frage also, kann man mit einer Batch CD/DVD und Virtuelle LW, bei Bedarf vom Suchlauf auschließen?

Weitere Frage die sich für mich aus dem Verzeichnis-test ergab. Ich gehe davon aus das gesuchte Programm existiert und jetzt will ich noch wissen ob es mindestens Nero Version 6 oder höher hat. Bisher löse ich das mit der in Nero-Installationspfad selbst enthaltenen NeroCMD.exe. Die liefert mir diese Werte und noch mehr. NeroCMD.exe selbst übergibt die Angaben an eine "neroerr.txt". Daraus teste ich dann die Version., allerdings sehr primitiv.

wie folgt:
@echo off
"C:\Programme\Ahead\Nero\nerocmd.exe" --version > nul
set neroversion=0
findstr /C:"Nero API version: 6." neroerr.txt >> vers_test.txt
if %ERRORLEVEL% EQU 0 set neroversion=6
findstr /C:"Nero API version: 7." neroerr.txt >> vers_test.txt
if %ERRORLEVEL% EQU 0 set neroversion=7

Kann man mit einer Batch auch eleganter, als vorstehend, die Programm-Versionen abfragen?

Danke und Gruß
onegasee59
Biber
Biber 10.10.2006 um 18:48:28 Uhr
Goto Top
Moin onegasee59,

wenn es um die eine installierte Version geht, würde ich die Registry befagen:
:: ----snipp getNeroInfo.bat
@echo off & setlocal
for /f "tokens=3" %%a in ('reg query "HKCU\Software\AHead" /s ^|find /i "RegisteredTypesNeroVersion"') do Set "NeroVers=%%a"  
for /f "tokens=3" %%a in ('reg query "HKCU\Software\AHead" /s ^|find /i "RegisteredTypesNeroPath"') do Set "NeroPath=%%a"  
for /f %%i in ("%neropath%") do echo Nero-Version [%NeroVers%], Installiert auf Drive:[%%~di] Pfad: [%%~pi]  

Output:
>getNeroInfo.bat
Nero-Version [6.6.0.16], Installiert auf Drive:[C:] Pfad: [\PROGRA~1\Ahead\Nero\]
Deine Variante über NeroCMD (am Prompt gezeigtface-smile
>>for /f "tokens=4" %a in ('c:\PROGRA~1\Ahead\Nero\nerocmd.exe --version^|find "API"') do @echo Nero-API-Version: %a  
Nero-API-Version: 6.6.0.16

Gruß
Biber
36539
36539 10.10.2006 um 19:13:08 Uhr
Goto Top
Moin Biber,

Deine Variante über NeroCMD (am Prompt gezeigtface-smile
for /f "tokens=4" %a in ('c:\PROGRA~1\Ahead\Nero\nerocmd.exe --version^|find "API"') do @echo Nero-API-Version: %a Nero-API-Version: 6.6.0.16

also....mir fehlen momentan die Worte um mein Staunen auszudrücken. face-smile
Ernsthafte Frage - Machst Du zu Batch&Shell-Programmierung auch richtige Lehrkurse?
Falls ja - ich wäre sehr interessiert!

Meine letzte Bitte kannst Du noch was zu meiner obigen 1. Frage sagen?:
Konkrete Frage also, kann man mit einer Batch CD/DVD und Virtuelle LW, bei Bedarf vom Suchlauf auschließen?


Herzliche Grüße in den Norden
onegasee59
36539
36539 11.10.2006 um 03:59:17 Uhr
Goto Top
Moin Biber,

dank Dir habe ich noch einen andere Variante der Versionsprüfung gefunden.
Ausgangspunkt ist das finden des Installationspfad.

**Programm finden Variante 1**
set proglw="kein LW"  
set progpfad="kein Installationspfad"   
for %%a in (c d e f g h i j k l m n o p q r s t u v w x y z) do @for /f %%i in ('dir /s /b %%a:\nero.exe ^2^>nul') do set "proglw=%%~di" & set "progpfad=%%~pi"  
**Programm finden Variante 2**
set proglw="kein LW"  
set progpfad="kein Installationspfad"  
for /f "tokens=2 delims==%% " %%i in ('ftype^|find /i "nero.exe"') do set "proglw=%%~di" & set "progpfad=%%~pi"   
**Erstelle VBS-Skript zur Prüfung von Dateiversionen**
set progver=progversion.vbs
echo Set oFSO = CreateObject("Scripting.FileSystemObject") >%progver%  
echo WScript.Echo oFSO.GetFileVersion(WScript.Arguments.Item(0)) >>%progver%
**Prüfe Version von nero.exe**
set nerofile=%proglw%%progpfad%\nero.exe
for /f "tokens=*" %%a in ('cscript.exe //Nologo %progver% %nerofile%') do set nerofilever=%%a  
IF %nerofilever% GEQ 7.0.0.0 (echo nero 7 ist installiert) ELSE (echo nero 6 ist installiert)

rem call cscript.exe //Nologo %progver% %nerofile% - liefert als Ergebnis 6.6.1.4 (ist die aktuellste Nero 6-Version)

Gruß
onegasee59
36539
36539 11.10.2006 um 04:08:19 Uhr
Goto Top
Moin Biber,

DANKE für die "Lehrstunde" im for-Befehl. So langsam komme ich dahinter. face-wink

Gruß
onegasee59
Biber
Biber 11.10.2006 um 10:07:13 Uhr
Goto Top
Sieht doch gut aus, onegasee59, face-wink

aber das
for %%a in (c d e f g h i j k l m n o p q r s t u v w x y z) ..
ist ja wirklich unschön, da gebe ich Dir Recht.

Ich hatte zwar gehofft, ich könnte mich vor der Antwort auf die Frage nach der Batch-Laufwerksidentifizierung drücken. Aber what shalls...

Also, schlechte Nachricht: Kann ich mit Batch-Bordmitteln nicht prüfen/erkennen.
Gute Nachricht - in solchen Fällen mach ich es wie MacGyver und schraube mir aus zwei Strohhalmen und einer Erdnuss irgendwas zusammen.

Ich kann mit VBS oder JS (was ich wohl auf jedem Rechner vorfinde) ja eben mal die Laufwerke, die ich brauche, abfragen.

In VBS gibt es das FileSystemObject, das wiederum eine Drives-Collection liefern kann (alle Lw, die der Rechner kennt).
Und jeder Drive hat einen DriveType mit einem von diesen 6 Werten:
"0" = "Unknown type of drive"  
"1" = "Removable drive"  
"2" = "Fixed drive"  
"3" = "Network drive"  
"4" = "CD-ROM drive"  
"5" = "RAM Disk"  

Also brate ich mir einen kleinen VBS-Schnipsel zusammen (den ich zur Not aus im Batch mit "echo" erzeugen kann).
Folgende Quick&Dirty-Strategie: Ich will
- eine GetDrives.vbs
- die mir beim Aufruf OHNE Paramter alle Fixed-Laufwerke als Text(liste) zurückgibt, z.B. "C,D,E"
- optional noch bestimmte andere Laufwerkstypen (meinetwegen Netz-Laufwerke) ergänzt.
Die optionalen gebe ich als Parameter (num. Lw-Typ wie oben) an, wenn ich will

Das sieht dann im ganzen Satz so aus:

:: --- getDrivesIWant2C.bat
@echo off & setlocal
set vbsSnippet=%temp%\%random%.vbs
 >%vbsSnippet% echo Set FSO = CreateObject("Scripting.FileSystemObject")   
>>%vbsSnippet% echo Set Drives = FSO.Drives
>>%vbsSnippet% echo set Args = wscript.arguments
>>%vbsSnippet% echo alldrives=""  
>>%vbsSnippet% echo wanteddrvs="2"  
>>%vbsSnippet% echo for i=0 to Args.count-1
>>%vbsSnippet% echo   wanteddrvs= wanteddrvs + "," + args(i)  
>>%vbsSnippet% echo next
>>%vbsSnippet% echo For Each d in Drives
>>%vbsSnippet% echo    if instr(1,wanteddrvs,d.Drivetype) then alldrives= alldrives +"," + d.Driveletter  
>>%vbsSnippet% echo Next>>%vbsSnippet%
>>%vbsSnippet% echo wscript.echo mid(alldrives,2)
>>%vbsSnippet% echo Set Drives = nothing
>>%vbsSnippet% echo Set FileSystemObject = nothing
>>%vbsSnippet% echo wscript.quit
REM Ein bisschen Demo:
For /f %%i in ('cscript //nologo %vbsSnippet%') do echo [DEBUG Lw-Liste nur Fixed ] %%i  
For /f %%i in ('cscript //nologo %vbsSnippet% 1 4 ') do echo [DEBUG Lw-Liste Fixed + Removable+ CDRom] %%i  
REM Ende von: Ein bisschen Demo:
For /f %%i in ('cscript //nologo %vbsSnippet%') do set "lwliste=%%i"  
echo [Lw-Liste Fixed] %lwliste%
echo [Der For-Befehl nur Fixed-Lw:.. for %%%%a in (%%lwliste%%) ..-^>.. for %%%%a in (%lwliste%)
del %vbsSnippet%
Dieser Schnipsel liefert am CMD-Prompt:
>getdrivesIWant2C.bat
[DEBUG Lw-Liste nur Fixed ] C,D
[DEBUG Lw-Liste Fixed + Removable+ CDRom] A,C,D,F,R
[Lw-Liste Fixed] C,D
[Der For-Befehl nur Fixed-Lw:.. for %%a in (%lwliste%) ..->.. for %%a in (C,D)

Denke, den kannst Du noch einbauen bei Bedarf.

Gruß
Biber
36539
36539 11.10.2006 um 18:17:04 Uhr
Goto Top
Moin Biber,

Den "Braten" muss ich erstmal verdauen. face-wink
Ich teste alles gründlich und melde mich wieder. Versprochen!
Kann aber ein bischen dauern.

Danke erstmal bis hierhin. face-smile

Herzlichen Gruß
onegasee59
Biber
Biber 11.10.2006 um 18:58:51 Uhr
Goto Top
Okay, onegasee59,

war ja nicht fair von mir, auch noch einen Mehrzeiler ganz ohne Kommentare hier abzuladen.
So was tun nicht mal Batchler...vollkommen kommentarlose Schnipsel irgendwo hinstellen.
Eigentlich nicht.

Ich hatte mir die Kommentare im VBS-Teil geschenkt, weil die definitiv keiner lesen kann
in den anderthalb Sekunden, in denen dieses temporäre Snippet im %temp%-Verzeichnis existiert.

Würde es ein dauerhaftes VBS-Schnipselchen sein sollen, wäre meine Kommentierung in etwa so:
' GetDrives.vbs  
Set FSO = CreateObject("Scripting.FileSystemObject") ' Ein FileSystemObject brauche ich...  
Set Drives = FSO.Drives	         ' denn das liefert mir die Drive-Collection  
set Args = wscript.arguments	         ' Falls der Benutzer Argumente angegeben hat, nenn ich die "Args"  
alldrives=""                               ' Alldrives will ich später zurückgeben..einen String der Form "C,D,R"  
wanteddrvs="2"			 ' immer will ich die Laufwerke Type "2"="Fixed Drives"  
for i=0 to Args.count-1		 ' Falls Parameter angegeben, dann in einen String schreiben ("2,4,5")  
  wanteddrvs= wanteddrvs + "," + args(i)    ' "wanteddrvs", weil es der User ja so wants...  
next  
For Each d in Drives		 ' Für jeden Drive d, den der Rechner kennt....  
   if instr(1,wanteddrvs,d.Drivetype) > 0 then alldrives= alldrives +"," & d.Driveletter  
   ' wenn der Type ("0" oder "1" oder..."5") in dem Text "wanteddrvs" (= "2.4.5") ist....  
   ' dann ein Komma und den zugehörigen DriveLetter zu "alldrives" dazu...  
Next
wscript.echo mid(alldrives,2)  ' In alldrives steht MINIMAL ",C" ; NORMAL "C,D,E" oder sowas.   
                               ' Erstes zeichen=Komma hauen wir wech.  
Set Drives = nothing	       ' ja, ja ..mein Ordnungsfimmel...diese und die folgenden Zeilen sind nicht Pflicht.  
Set FileSystemObject = nothing ' selbst erschaffene Objects auch selbst zerstören...welcher Bill sollte das für uns tun?  
wscript.quit                   ' und damit es auch jedes M$ mitbekommt, dass hier Ende ist, schreiben wir das.  

Dann lässt es sich wenigstens in Ansätzen nachvollziehen.
Gruß
Biber
P.S. was ich immer noch nicht verstanden habe: Wozu brauchst Du diese Trennung von Drive und Path der "Nero.exe"?
Du verwendest die doch ohnehin nur in Kombination.
36539
36539 11.10.2006 um 20:23:49 Uhr
Goto Top
Moin Biber,

es war absolut Ok. Ich hätte mich da schon "durchgefuttert".
Dennoch ist natürlich Deine ausführliche Erklärung für mich sehr hilfreich.

Zu Deiner Frage im PS:
Zum einem wollte ich wissen ob und wie man die Aufsplittung von Pfadbestandteilen mit den Mitteln einer Batch-Programmierung erreichen kann. Zum Anderen ist es so das ich ein Tool schreibe für die Bereinigung der Decoderarchitektur _NACH_ einer Installation von Nero 6 oder höher. Nero reißt die Decoder und Directshowfilter (für Audi und Video) nämlich ungefragt an sich. Viele User haben irgendwann unerklärliche Probleme mit anderen Multimedia-Anwendungen. Was ich bis vor kurzem nicht wusste, Nero kauft seine Decoder dazu und entwickelt sie nicht selbt. Wäre alles nicht so schlimm, wenn sich die Decoderarchitektur von Nero absolut Systemkonform verhalten würden und nicht bei den anderen Anwendungen in den Vordergrund drängeln würde und dabei oftmals nicht wirklich unterstützen. Ergebnis sind leider immer wieder nicht funktionierende Multimedia-Anwendungen wie Zoom-Player, MPC, Quicktime Player usw.

Ich zitiere mal einen absoluten Könner (Thomas Beyer) auf dem Multimedia-Gebiet (Aussage gilt analog für Nero 6)
Auch wenn der Installer von Nero bei der 7er Version suggeriert, er würde bei Abwahl der entsprechenden
Komponenten die dazugehörigen Decoder und Parser nicht installieren: Man tut es trotzdem.

Bei einer vollständigen Deinstallation werden die DLLs zwar physikalisch entsorgt, es bleibt aber noch jede
Menge Müll in der Registry übrig, u.a. auch verwaiste Einträge auf Decoder, welche dann Deine
DirectShowarchitektur beeinträchtigen können.

Wichtig das Tool fasst die Dateien von Nero nicht physisch an, sonst bekäme ich ernsthaft Probleme mit Neros Anwälten. face-wink

Deine Tips zur Versionsprüfung und vor allem zum Umgang mit dem For-Befehl haben mir da unheimlich Schub gegeben. Bis auf Feinheiten habe ich es fertig. Wichtig war hier vor allem das ich den echten/richtigen Installationspfad finde und dann aufsplitten kann, da sich erst daraus automatisch die Pfade ergeben die ich dann als feste Variable festlegen kann und ich sicher sein kann das die enthaltene Pfade tatsächlich existieren. Diese Pfade benötige ich für die eigentliche Bereinigung (Deregistrierung und ReDeregistrierung) der Decoder und Directshowfilter von Nero. Die LW-Angabe ermöglicht mir in einer späteren Phase zu prüfen und abzusichern das sich Nero 6 (oder höher) weder auf einem virtuellen noch externen LW befindet, sondern eine "echte" Nero-Installation vorliegt.

Wenn ich es fertig habe stelle ich es auf meiner Website und auf der Website des Initiators (Thomas Beyer) als Freeware zu Verfügung. Systemvorausetzungen sind WIN 2000/XP und Nero 6 (oder höher). siehe hierzu Video- und Audio-Codecs ermitteln, installieren oder reparieren

Falls Du Interesse hast und schon vorab einen Blick drauf werfen willst, sende ich Dir die Version zum gegenwärtigen Stand gerne zu.

Gruß
onegasse59 (meine Website http://www.der-wmp.de)
Biber
Biber 11.10.2006 um 21:43:31 Uhr
Goto Top
Moin onegasee59,

eine TOP-Seite, die Du da hast. Respekt.
Dann noch mal der Vollständigkeit halber:
Wenn es tatsächlich um die installierte Nero-Version geht, dann würde ich natürlich
- als erste Wahl die Registry befragen
- als zweite Wahl dieses FType-Geraffel nutzen (das ja auch nur über Bande die Registry-Einträge widerspiegelt).
- als definitiv letzte Krücke bleibt dieser Weg über das Dateisystem - der ist ja gerade bei solchen beliebten Tools wie WinZip oder Nero höchst unsicher.
Denn da hat ja jeder DAU/jede DAUin irgendwo eine alte, eine Beta, eine halbe Installation in irgendeinem vergessenen Ordner.
Von Sicherungen auf Festplatte 3 oder 4 ganz zu schweigen.

Ach ja, was den Vorab-Blick betrifft: das Angebot nehme ich dankend an.

Schönen Abend
Biber
36539
36539 18.10.2006 um 23:11:34 Uhr
Goto Top
Moin Biber,

eine TOP-Seite, die Du da hast. Respekt.

Danke face-smile

Wenn es tatsächlich um die installierte Nero-Version geht, dann würde ich natürlich
- als erste Wahl die Registry befragen

Nach einigen Tests hat sich das absolut bestätigt und.......

Denn da hat ja jeder DAU/jede DAUin irgendwo eine alte, eine Beta, eine halbe Installation
in irgendeinem vergessenen Ordner. Von Sicherungen auf Festplatte 3 oder 4 ganz zu schweigen.

das ebenso. Alle anderen Varianten der Emittlung des Installationspfades einer Anwendung (in diesem Fall für Nero) sind tatsächlich viel zu ungenau.

Schönen Abend
onegasee59