rolandsc7
Goto Top

Deinstallation via Batch bei ca 2000 PCs

Hallo liebe Administratorinnen und Administratoren,

seit etwa drei Tagen quäle ich mich mit einem Problem herum. Vielleicht gibt es ja jemand unter euch der eine gute Idee hat. Ich möchte via Batch und AutoIt ein Programm Deinstallieren und danach eines installieren. Die PCs sind Testgeräte und alle User haben Administratoren Recht. Das hat natürlich zu Folge dass die Betriebssysteme alle unterschiedlich sind und im AppWiz.cpl keine einheitliche Reihenfolge existiert. Die PCs sind in keiner Domäne und somit nicht über GP konfigurierbar. Das ist auch so gewollt, das es Testsysteme sind. Ein Liefersystem um Updates zu integrieren gibt es, kann durch entpacken und ausführen einer Batch Datei initiiert werden. Das Programm welches ich deinstallieren möchte, hat je nach Zeitpunkt der Installation eine unterschiedliche InstallGuid, somit auch einen unterschiedlichen Install Pfad. Ich weiß aber das die Deinstallationsroutine sich in einen Unterverzeichnis in C:\PROGRAMME\INSTALLSHIELD INSTALLATION INFORMATION\ befindet und die Setup.ini einen Eintrag mit Beispielsweise "AppName=Wurstbrot mit Käse" hat. In der Setup.ini steht auch die "InstallGuid={314EEA6D-6A78-11B4-932F-00A0D02289CC}" was dem Unterverzeichnis entspricht: "C:\Programme\InstallShield Installation Information\{314EEA6D-6A78-11B4-932F-00A0D02289CC}\" Durch die Integration >"C:\Programme\InstallShield Installation Information\{314EEA6D-6A78-11B4-932F-00A0D02289CC}\setup.exe" -runfromtemp -l0x0409 -removeonly< kann ich das Programm zusammen mit AutoIt dann auch problemlos deinstallieren. Ausprobiert habe ich folgendes: for /F "delims=" %%a in ('dir /b /s Setup.ini') do (find "AppName=Wurstbrot mit Käse" "%%~fa" && "%%~fa">> datei.txt) dadurch stoppt das Batch nach Auffinden von "AppName=Wurstbrot mit Käse" aber es wird die datei.txt leider ohne Inhalt erstellt. Mit for /F "delims=" %%a in ('dir /b /s Setup.ini') do (find "AppName=Wurstbrot mit Käse" "%%~fa" >> datei.txt) bleibt die Batch nicht stehen und die datei.txt enthält:
C:\PROGRAMME\INSTALLSHIELD INSTALLATION INFORMATION\{314EEA6D-6A78-11B4-932F-00A0D02289CC}\SETUP.INI
AppName=Wurstbrot mit Käse

C:\PROGRAMME\INSTALLSHIELD INSTALLATION INFORMATION\{95A57DD4-BF61-4A15-9A7B-A1FF015AA145}\SETUP.INI

C:\PROGRAMME\INSTALLSHIELD INSTALLATION INFORMATION\{BB6A4928-5574-4CBF-9AC9-FC57C22F9212}\SETUP.INI
Jetzt stellt sich mir die Frage wie extrahiere ich die Pfadinformation ohne die --- und was passiert wenn die Information an 2. oder 3. Stelle steht. Gibt es die Möglichkeit wenn "AppName=Wurstbrot mit Käse" gefunden wurde, den Pfad der Setup.ini in eine Variable (z.B.: %pfad%) zu füllen und dann mit ""%pfad%"\setup.exe" -runfromtemp -l0x0409 -removeonly die Deinstallationsroutine zu starten.
Um das noch mal zu verdeutlichen, aus:
""%pfad%"\setup.exe" -runfromtemp -l0x0409 -removeonly
soll sich dann prinzipiell folgendes ergeben:
"C:\Programme\InstallShield Installation Information\{314EEA6D-6A78-11B4-932F-00A0D02289CC}\setup.exe" -runfromtemp -l0x0409 -removeonly

Uff, was für ein Roman, hatte die Hoffnung dass vielleicht einer nen guten Tipp für mich hat. Vielen Dank erst mal fürs lesen. face-wink

Content-Key: 244560

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

Ausgedruckt am: 19.03.2024 um 04:03 Uhr

Mitglied: Rudbert
Rudbert 24.07.2014 um 14:27:36 Uhr
Goto Top
Hallo,


schau mal in die Registry unter "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall". Du könntest z.B. ein Batch- oder AutoIT-Skript schreiben, welches deine Software anhand des Namens aus diesem Baum sucht, und den Eintrag "UninstallString" oder "QuietUninstallString" ausführt.

PS: Warum nimmst du die PCs nicht in eine Domäne auf? Die User können sich ja trotzdem an den lokalen Maschinen anmelden mit lokalen Admins? Würde solche Mammutaufgaben sehr erleichtern :D


mfg
Mitglied: rolandsc7
rolandsc7 24.07.2014 um 14:59:48 Uhr
Goto Top
Hallo Rudbert,

Ja, Du hast recht, steht in der Registry und daher habe ich auch den Befehl zur Deinstallation (UninstallString):
"C:\Programme\InstallShield Installation Information\{314EEA6D-6A78-11B4-932F-00A0D02289CC}\setup.exe" -runfromtemp -l0x0409 -removeonly
Trotzdem habe ich das Problem, dass an allen Maschinen das Verzeichnis unterschiedlich ist. Die nächste Maschine könnte:
"C:\Programme\InstallShield Installation Information\{95A57DD4-BF61-4A15-9A7B-A1FF015AA145}\setup.exe" -runfromtemp -l0x0409 -removeonly
haben

Glaub mir, ich hätte die auch gern in einer Domäne, vor allem wegen WSUS, aber das ist nicht gewollt.

Trotzdem Danke.
Mitglied: Dani
Dani 24.07.2014 um 15:41:06 Uhr
Goto Top
Moin,
du liest mit der Batch/Powershell den Wert des Schlüssels (Uninstall) aus und nimmst diesem im zweiten Schritt, zum deinstallieren.
Soweit zur Theorie...


Gruß,
Dani
Mitglied: Rudbert
Rudbert 24.07.2014 um 16:21:01 Uhr
Goto Top
Hi,

so wie @Dani das geschildert hat hatte ich das gemeint; damit holt er auf jedem PC den (ja auf jedem PC unterschiedlichen) korrekten Uninstall-Befehl.

mfg
Mitglied: 0x32f1
0x32f1 24.07.2014 um 16:24:08 Uhr
Goto Top
Wie wäre es damit: alle "setup.ini" durchsuchen und dann den Uninstall-String basteln:

@ECHO OFF
REM 0x32f1
SETLOCAL ENABLEDELAYEDEXPANSION
IF DEFINED ProgramFiles(x86) (CD /D "%PROGRAMFILES(x86)%\InstallShield Installation Information") ELSE (CD /D "%PROGRAMFILES%\InstallShield Installation Information")  
FOR /F "delims=" %%i IN ('DIR /B /S setup.ini') DO (  
  FIND "AppName=MyAppName" "%%i"  
  IF "!ERRORLEVEL!"=="0" (  
    SET tempStr=%%i
	ECHO "!tempStr:~0,-10!\setup.exe" -runfromtemp -l0x0409 -removeonly  
  )
)
Mitglied: Snowman25
Snowman25 24.07.2014 aktualisiert um 16:55:15 Uhr
Goto Top
Hallo @rolandsc7,

ist die Software unter wmic registriert?
Führe von einer Commandline
wmic product
aus.
Sollte es in dieser Liste vorhanden sein kannst du es mit
wmic product where "name like '%<wurstbrot>%'" call uninstall
aus einer admin-shell heraus deinstallieren.
% Ist ein Wildcard-charakter. Wenn du dies innerhalb einer Batch ausführen möchtest, musst du die %-Zeichen jeweils verdoppeln.

Gruß,
@Snowman25
Mitglied: rolandsc7
rolandsc7 24.07.2014 aktualisiert um 18:47:53 Uhr
Goto Top
Hallo 0x32f1,
vielen Dank für Deine exzellente Lösung, klappt wie meine Bürotür, habe angepasst auf:
@ECHO OFF
REM 0x32f1 der Beste aller Admins
SETLOCAL ENABLEDELAYEDEXPANSION
IF DEFINED ProgramFiles(x86) (CD /D "%PROGRAMFILES(x86)%\InstallShield Installation Information") ELSE (CD /D "%PROGRAMFILES%\InstallShield Installation Information")  
FOR /F "delims=" %%i IN ('DIR /B /S setup.ini') DO (  
  FIND "Product=Wurstbrot mit Käse" "%%i"  
  IF "!ERRORLEVEL!"=="0" (  
    SET tempStr=%%i
	ECHO "!tempStr:~0,-10!\setup.exe" -runfromtemp -l0x0409 -removeonly  
  )
)

"!tempStr:~0,-10!\setup.exe" -runfromtemp -l0x0409 -removeonly  

Darf ich Dir noch eine Frage, wegen dem Verständnis stellen? Wie integriere ich die Variable %%i in einen Verzeichnispfad. (Beispiel mit anderem Ansatz: Registry) Selbst mit Notepad ++ und der farbigen Markierung krieg ich das trotz deinem Beispiels nicht gedrechselt. Manno bin ich doof!!!! face-sad
@echo off &setlocal

set "name=Wurstbrot Wurst Brot 20.10.05 (C:\\Programme\\Wurstbrot\\Wurstbrot Wurst 20.10.05)"  
for /f "tokens=7 delims=\" %%i in (  
  'reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"^|findstr /riec:"\\Uninstall\\{[0-9A-F][0-9A-F]*-[0-9A-F][0-9A-F]*-[0-9A-F][0-9A-F]*-[0-9A-F][0-9A-F]*-[0-9A-F][0-9A-F]*}"'  
) do (
  for /f "tokens=2*" %%j in (  
    'reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%%i" /v "DisplayName" 2^>nul^|findstr /iec:"%name%"'  
  ) do echo %%i 
)
Weder mit :
"C:\Programme\InstallShield Installation Information\!%%i!\setup.exe" -runfromtemp -l0x0409 -removeonly
noch mit :
  IF "!ERRORLEVEL!"=="0" (  
    SET pfad=%%i
	ECHO "!pfad:~0,-10!\setup.exe" -runfromtemp -l0x0409 -removeonly  
  )
)
"C:\Programme\InstallShield Installation Information\!pfad:~0,-10!\setup.exe" -runfromtemp -l0x0409 -removeonly
bekomme ich die Variable integriert. Dein Setup.ini funktioniert ja, aber ich verstehe die Mechanik dahinter noch nicht.
Mitglied: rolandsc7
rolandsc7 24.07.2014 um 18:26:13 Uhr
Goto Top
Hallo Snowman25,

leider wird mit

wmic product list

das Programm nicht aufgelistet. Das wäre eine elegante (weil einfach nur eine Zeile) Lösung.

Trotzdem Danke euch allen, für die Geduld und Hilfe, schönen Feierabend. face-smile

Gruß,
Roland
Mitglied: 0x32f1
0x32f1 25.07.2014 um 07:32:15 Uhr
Goto Top
Der Trick dabei ist die dritte Zeile:

SETLOCAL ENABLEDELAYEDEXPANSION

Näheres siehe z.B. http://www.netikka.net/tsneti/info/tscmd158.htm

mit ":~0,-10" werden nur die letzten 10 Zeichen abgeschnitten, weil im tempStr ja der Pfad zur Setup.ini steht. 9 würden zwar auch reichen, aber so können wir - der Übersicht halber - den Backslash vor der setup.exe im neu zusammengebauten String selber setzen. Genauer betrachtet würde in deinem Fall auch reichen:

SET tempStr=%%i 
ECHO "!tempStr:~0,-3!exe" -runfromtemp -l0x0409 -removeonly   

um nur "ini" abschneiden und "exe" anhängen.

Wenn du jetzt beispielsweise nur die ID brauchst, kannst du den String natürlich von vorne auch noch abschneiden, etwa

ECHO "!tempStr:~52,-3!exe" -runfromtemp -l0x0409 -removeonly   

bzw. dann direkt in deine REG QUERY einbauen

'reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\!tempStr:~52,-10! /v "DisplayName"