Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Abbildpfadname eines Prozesses abfragen. Prozess abhängig von seinem Abbildpfadnamen (Ausführungspfad, ExecutablePath) neustarten

Frage Entwicklung Batch & Shell

Mitglied: evinben

evinben (Level 2) - Jetzt verbinden

04.04.2013, aktualisiert 11.01.2014, 3909 Aufrufe, 17 Kommentare, 1 Danke

Hallo,

wie kann der Abbildpfadname eines Prozesses abgefragt werden?


So wie es aussieht bin ich wohl der erste mit so einer Frage hier, sodass es mich sehr wundert, dass es "so selten" vorkommt, wie es zu vermuten wäre.

Gruß
evinben


Kurz zu dem Vorhaben:
Einige Prozesse müssen öfters beendet und neugestartet werden. Da jedoch deren Pfade sich ändern, müssen die Pfade zuerst abgefragt und in Variable gesetzt werden und erst dann die Prozesse beendet und neu gestartet werden.
Daher wird eine Lösung zum Abfragen des Abbildpfadnamens eines Prozesses benötigt.
Wenn es per Batch umständlich realisierbar ist, dann eventuell per VBS.
Wobei Batch wäre jedenfalls zu bevorzugen, da der Hauptcode in Batch ist
Mitglied: AndreasHoster
04.04.2013 um 10:04 Uhr
Wenns auch ein VBS Skript sein darf:
01.
On Error Resume Next 
02.
 
03.
Const wbemFlagReturnImmediately = &h10 
04.
Const wbemFlagForwardOnly = &h20 
05.
 
06.
   Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2") 
07.
   Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process where Name='notepad.exe'", "WQL", _ 
08.
                                          wbemFlagReturnImmediately + wbemFlagForwardOnly) 
09.
 
10.
   For Each objItem In colItems 
11.
      WScript.Echo "CommandLine: " & objItem.CommandLine 
12.
      WScript.Echo "ExecutablePath: " & objItem.ExecutablePath 
13.
      WScript.Echo "Name: " & objItem.Name 
14.
   Next
Beispielausgabe:
CommandLine: "notepad.exe" C:\boot.ini
ExecutablePath: C:\WINDOWS\system32\notepad.exe
Name: notepad.exe

Wenn man Commandline und Name nicht braucht, kann mans auch weglassen.
Wenn man in Zeile 7 where Name='notepad.exe' weglässt, dann listet das Skript alle auf.
Bitte warten ..
Mitglied: evinben
04.04.2013 um 12:43 Uhr
Hallo @AndreasHoster

deine Lösung hat mich zu einer Idee gebracht - per Batch via WMIC:

01.
for %%d in ( 
02.
	notepad.exe 
03.
	cmd.exe 
04.
	) do for /f "tokens=*" %%e in ('wmic process get ExecutablePath^|findstr /i /c:"%%d"') do ( 
05.
		rem Abbildpfadname anzeigen: 
06.
		echo "%%e" 
07.
		rem taskkill /T /F /IM %%d 
08.
		rem start "" "%%e" 
09.
		)
Leider aus mir unbekannten Gründen gibt "%%e" in der 6. und 8. Zeile nicht den Pfad in Anführungszeichen auf einer Zeile aus. Daher funktioniert momentan der Code nicht.
Beim Aktivieren der 8. Zeile, lautet die Fehlermeldung wie folgt 1:1 (Zeilenvorschub beachten):

C:\Program Files\Notepad.exe
" konnte nicht gefunden werden. Stellen Sie sicher, dass Sie den Namen richtig eingegeben
haben und wiederhohlen Sie den Vorgang.


Anscheinend ist da etwas mit WMIC besonders zu beachten, falls es kein Bus sein sollte. Nun muss der Zeilenvorschub entfernt werden, damit das Anführungszeichen auf die gleiche Zeile kommt.

Gruß
evinben
Bitte warten ..
Mitglied: DerWoWusste
04.04.2013 um 12:59 Uhr
Hi.

Wie wär's mit einem Powershell-Einzeiler?
01.
get-process powershell |fw -property path
liefert beispielsweise
C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe
als Ausgabe.
Bitte warten ..
Mitglied: AndreasHoster
04.04.2013 um 13:29 Uhr
Ich kenne mich jetzt mit WMIC nicht sonderlich gut aus, ich habe meine meisten Sachen immer gleich komplett in VBS geskriptet, da Batch doch manche Beschränkung hat.
Aber die Idee von @DerWoWusste mit Powershell ist gut.
Bitte warten ..
Mitglied: evinben
04.04.2013, aktualisiert um 13:43 Uhr
Hallo @DerWoWusste und @AndreasHoster,

wenn ich die Zeit neue Skript-Sprachen zu studieren hätte, z. B. wie in PowerShell FOR-Schleifen verwendet werden (da gibt es nicht mal Pause, sondern Start-Sleep -s 10), hätte ich es gerne umgesetzt.
Gerade habe ich mich gemütlich ein bisschen in Batch eingearbeitet...
Jedoch mit eurer Hilfe immer gerne bin ich bereit zu lernen.

Gruß
evinben
Bitte warten ..
Mitglied: Endoro
04.04.2013 um 14:12 Uhr
Hallo evinben,

du könntest folgendes mal versuchen (ungetestet):

01.
for %%d in ( 
02.
	notepad.exe 
03.
	cmd.exe 
04.
	) do for /f "tokens=*" %%e in ('wmic process get ExecutablePath^|findstr /i /c:"%%d"') do ( 
05.
	  for /f "delims=" %%f in ("%%~e") do ( 
06.
		rem Abbildpfadname anzeigen: 
07.
		echo "%%~f" 
08.
		rem taskkill /T /F /IM %%d 
09.
		rem start "" "%%~f" 
10.
11.
	)
Gruss,
Bitte warten ..
Mitglied: evinben
04.04.2013, aktualisiert um 15:30 Uhr
Hallo @Endoro,

mit deiner Lösung wird drei Mal der gleiche Pfad angezeigt (d. h. in der 9. Zeile drei Mal derselbe Prozess von cmd.exe gestartet), anstatt zwei verschiedene.

Gruß
Bitte warten ..
Mitglied: Endoro
04.04.2013 um 18:21 Uhr
Hi,

was wird denn ausgegeben?
Poste das doch mal.

Gruss!
Bitte warten ..
Mitglied: evinben
04.04.2013 um 21:01 Uhr
Hallo @Endoro,

also die Ausgabe scheitert schon bei der folgenden Zeile:
01.
for %%d in (Apoint.exe ApMsgFwd.exe ApntEx.exe) do for /f "tokens=*" %%e in ('wmic process get ExecutablePath ^|findstr /i /c:"%%d"') do echo "%%e"
Übernimm einfach den Code 1:1 und führe dieses von einer Batch-Datei aus, dann wirst du sehen, dass alle mögliche Prozesse abgearbeitet werden, jedoch nicht ApMsgFwd.exe

Direkt von cmd geht es mit der folgenden Zeile aber:
01.
for %d in (Apoint.exe ApMsgFwd.exe ApntEx.exe) do for /f "tokens=*" %e in ('wmic process get ExecutablePath ^|findstr /i /c:"%d"') do echo "%e"
sehr merkwürdig
Gruß
Bitte warten ..
Mitglied: evinben
11.01.2014, aktualisiert um 14:53 Uhr
Hallo,

bei dem Ausführen des ganz unteren Codes, erhalte ich in der Eingabeaufforderung folgende Zeilen 1:1

01.
 
02.
Folgender Prozess wird beendet: C:\windows\Explorer.EXE 
03.
"a  "C:\windows\Explorer.EXE 
04.
 
05.
"b "C:\windows\Explorer.EXE 
06.
 
07.
"c "C:\windows\Explorer.EXE 
08.
Drücken Sie eine beliebige Taste . . .
Wenn wir die Ausgabe des Variablenwertes in der 3. Zeile genau betrachten, stellen wir fest, dass am Anfang der Zeile ungewollt ein Anführungszeichen eingefügt wird und das allererste Zeichen aus dem Variablenwert (1) hier nicht ausgegeben wird bzw. ganz verloren geht. Außerdem wird am Ende der Zeile ein Anführungszeichen nicht ausgegeben.

In der Datei tmp.txt sieht jedoch so aus:
01.
C:\windows\Explorer.EXE                                                 
02.
 
03.
"C:\windows\Explorer.EXE                                                 
04.
05.
 
Nach mehreren Versuchen habe ich leider den Fehler nicht beseitigen können.
Hättet ihr eine Lösung?


Hier ist der besagte Code

01.
@echo off 
02.
setlocal enabledelayedexpansion 
03.
@prompt -$G 
04.
chcp 1252 >nul 
05.
PushD %~dp0 
06.
echo. 
07.
 
08.
:Options 
09.
:~~~~~~~~~~~~~~~~ 
10.
 
11.
 
12.
:~~~~~~~~~~~~~~~~ 
13.
:/End options 
14.
 
15.
 
16.
 
17.
:CODE 
18.
:~~~~~~~~~~~~~~~~ 
19.
 
20.
:Mit WMIC wird der Abbildpfadname eines Prozesses abgefragt - erfordert Administrator-Rechte! 
21.
 
22.
for %%d in ( 
23.
	explorer.exe 
24.
	iexplorer.exe 
25.
	) do for /f "tokens=*" %%e in ('wmic process get ExecutablePath^|findstr /i /c:"%%d"') do ( 
26.
			rem Abbildpfadname anzeigen: 
27.
			echo Folgender Prozess wird beendet: %%~e 
28.
rem NACHFOLGENDER ABSCHNITT IST NUR VORÜBERGEHEND FÜR DEN TEST ZU VERSTEHEN 
29.
rem ########################################################################## 
30.
echo 1a  "%%e" 
31.
echo. 
32.
set "var=%%e" 
33.
echo 2b "!var!" 
34.
echo. 
35.
set "var=!var: =!" 
36.
echo 3c "!var!" 
37.
 
38.
type nul>tmp.txt 
39.
echo %%e>tmp.txt 
40.
echo "%%e">>tmp.txt 
41.
pause & rem ################################################################## 
42.
			taskkill /T /F /IM %%d 
43.
			start "" "%%~e" &&echo Prozess "%%~e" wurde gestartet 
44.
			echo. 
45.
46.
 
47.
:Für direkten Test in der Eingabeaufforderung 
48.
:for /f "tokens=*" %e in ('wmic process get ExecutablePath^|findstr /i /c:"explorer.exe"') do echo %e 
49.
:for /f "tokens=*" %e in ('wmic process get ExecutablePath^|findstr /i /c:"explorer.exe"') do for /f "tokens=* delims= " %f in ("%~e") do echo %f 
50.
 
51.
:timeout /t 3 >nul 
52.
pause >nul
Bitte warten ..
Mitglied: DerWoWusste
11.01.2014, aktualisiert um 20:34 Uhr
Neun Monate später wieder reindenken macht mir wenig Spaß, sorry.
Bitte warten ..
Mitglied: Endoro
11.01.2014, aktualisiert um 20:21 Uhr
Hey, das ist das wmic Schätzchen mit den trailing carriage returns:
01.
for /f "skip=1delims=" %a in ('wmic process where "name='explorer.exe' OR name='iexplore.exe'" get ExecutablePath') do @for /f "delims=" %b in ("%~a") do @echo %~b
Läuft hier so in der Shell.

Gruss.
Bitte warten ..
Mitglied: evinben
12.01.2014, aktualisiert um 13:16 Uhr
Hallo Endoro,

das Problem ist nicht das Neustarten der Prozesse (dank AndreasHoster@ mit dem Hinweis auf wmic und anschließend dir, habe ich es vor einem Jahr bereits erledigt), sondern:

1. die nachfolgenden Leerzeichen in der Variable (sobald deine aller letzte Variable (%~b) in Anführungszeichen gesetzt wird, werden diese ersichtlich). Das Problem habe ich heute soweit beheben können.
2. Wenn ein Prozess nicht gefunden worden ist, dann meldet wmic "Keine Instanzen verfügbar". Und genau an der Stelle muss ein echo rein, mit der Meldung, dass der abgefragte Prozess gar nicht gestartet ist.

Ich poste den Code erneut:

01.
@echo off 
02.
@prompt -$G 
03.
chcp 1252 >nul 
04.
PushD %~dp0 
05.
echo. 
06.
 
07.
:Mit WMIC den Abbildpfadname eines Prozesses abfragen 
08.
 
09.
for %%d in ( 
10.
	explorer.exe 
11.
	explorer1.exe 
12.
	explorer2.exe 
13.
	usw...exe 
14.
	) do ( 
15.
		setlocal enabledelayedexpansion 
16.
		for /f "tokens=*" %%e in ('wmic process where "name='%%d'" get ExecutablePath^|findstr /i /c:"%%d"') do if not defined %%e echo Der Prozess %%e konnte nicht gefunden werden & ( 
17.
			for /f "delims=" %%f in ("%%~e") do ( 
18.
				rem Abbildpfadname anzegen: 
19.
				set ExecPath=%%f 
20.
				call :loop 
21.
				echo Folgender Prozess wird beendet: "!ExecPath!" 
22.
				taskkill /T /F /IM %%d 
23.
				start "" "!ExecPath!" &&echo Folgender Prozess ist neugestartet worden: "!ExecPath!" 
24.
				echo. 
25.
26.
		endlocal 
27.
28.
29.
 
30.
goto :next 
31.
rem Leerzeichen am Ende einer Variable entfernen 
32.
:loop 
33.
if "%ExecPath:~-1%"==" " set "ExecPath=%ExecPath:~0,-1%" & goto :loop 
34.
goto :eof 
35.
:next 
36.
 
37.
:timeout /t 3 >nul 
38.
pause >nul
Gruß
evinben
Bitte warten ..
Mitglied: Endoro
12.01.2014 um 14:04 Uhr
Hey,

defined kann bei Forschleifenparametern nicht verwendet werden. Richtig ist:
01.
if "%%~a"==""
Die Leerzeichen können so entfernt werden:
01.
for /f "tokens=1*delims==" %a in ('wmic process where "name='explorer.exe' OR name='iexplore.exe'" get ExecutablePath /value') do @for /f "delims=" %c in ("%~b") do @echo "%~c"
Gruss.
Bitte warten ..
Mitglied: evinben
12.01.2014, aktualisiert 14.01.2014
perfekte Umsetzung!
Vielen Dank für diesen Lösungsvorschlag - dies habe ich gleich so umgesetzt.
Was bewirkt genau das zweie "=" Zeichen in delims, außer Wunder ?
Es geht ja um "carriage return"-Zeichen. ???

Wie oben geschrieben ist der 2. Punkt noch offen: Wenn ein Prozess nicht gefunden worden ist, dann meldet wmic "Keine Instanzen verfügbar". Wie kann dieser Zustand abgefragt werden (wie geschrieben hier muss eine Bedingung rein - nehmen wir mal ECHO PROZESS NICHT VORHANDEN & goto :MachAnders)?
Mit %ERRORLEVEL% haut es nicht hin.
Aber auch mit der von dir vorgeschlagenen Variante if "%%~a"=="" (anstatt if not defined %%~a) klappt es in der 1. FOR-Schleife nicht (und bis zu der 2. FOR-Schleife kommt es sowieso nicht soweit).

Gruß
Bitte warten ..
Mitglied: Endoro
13.01.2014 um 22:45 Uhr
Hey,

das Gleichheitszeichen nach dem Gleichheitszeichen führt dazu, dass die for /f Schleife dieses als Tokentrenner betrachtet. Aus dem Token ExecutablePath=C:\windows\Explorer.EXE werden die Token ExecutablePath und C:\windows\Explorer.EXE.

Die überzähligen Wagenrücklaufzeichen ("carriage return", CR, ASCII 13, HEX x0d) werden von wmic aus nur M$ bekannten Gründen produziert und verunstalten die Konsolenausgabe sowie die Variablenzuweisung mit set. Wenn die wmic Ausgabe duch ein Hexdump-Programm gepiped wird, kann zB folgendes beobachtet werden:
0000000: 0d 0d 0a 0d 0d 0a 45 78 65 63 75 74 61 62 6c 65  ......Executable 
0000010: 50 61 74 68 3d 43 3a 5c 77 69 6e 64 6f 77 73 5c  Path=C:\windows\ 
0000020: 45 78 70 6c 6f 72 65 72 2e 45 58 45 0d 0d 0a 0d  Explorer.EXE.... 
0000030: 0d 0a 0d 0d 0a 0d 0d 0a                          ........
Diese unerwünschten Doppel-0d zu entfernen gelingt am besten, wenn die Ausgabe mit einer weiteren Forschleife "gefiltert" wird.

Zu deinem Code noch ein Vorschlag:
01.
@ECHO OFF &SETLOCAL 
02.
for /f "tokens=1*delims==" %%a in ('wmic process where "name='explorer.exe' OR name='iexplore.exe'" get ExecutablePath /value') do ( 
03.
	for /f "delims=" %%c in ("%%~b") do ( 
04.
		rem Abbildpfadname anzeigen: 
05.
		set "ExecPath=%%~c" 
06.
		echo Folgender Prozess wird beendet: "%%~c" 
07.
		taskkill /T /F /IM %%d 
08.
		start "" "%%~c" &&echo Folgender Prozess ist neugestartet worden: "%%~c" 
09.
		echo( 
10.
11.
12.
 
13.
if not defined ExecPath echo(Prozesse nicht gefunden!
Gruss.
Bitte warten ..
Mitglied: evinben
14.01.2014 um 13:02 Uhr
Hallo Endoro!

hier hat sich etwas Missverständnis eingeschichtet (dass delims beliebige Trennzeichen (Delimeter) repräsentiert ist schon klar, sonst wäre ich nicht so weit gekommen).
Als ich die Frage mit dem Gleichheitszeichen gestellt habe, war ich immer noch bei der alten Ausgabe, also:
01.
C:\Windows\system32>for /f "skip=1delims=" %a in ('wmic process where "name='explorer.exe' OR name='iexplore.exe'" get ExecutablePath') do @for /f "delims=" %b in ("%~a") do @echo %~b 
02.
C:\Windows\Explorer.EXE 
03.
C:\Program Files\Internet Explorer\iexplore.exe
und dachte mir du hättest da undokumentierten Judogriff angewandt, etwa was die ganze Zeit Phil macht , um das CR-Zeichen zu entfernen. Alles klar, jetzt verstehe ich, dass es ganz klassisch abläuft. Der zusätzliche Schalter /value macht es einfacher. Auf die Idee wäre ich jedenfalls nie gekommen und erneut vielen Dank hierfür!

Dein zusätzlicher Code-Vorschlag wird so allerdings nicht gehen, da in meiner 1. FOR-Schleife ja eine Liste von Prozessen abgearbeitet wird und wenn der "nicht ausgeführte Prozess" nicht zufälligerweise der letzte in dieser Liste wäre, dann würde deine 13. Zeile (echo(Prozesse nicht gefunden!) nicht abgearbeitet.

Eine weile habe ich rumüberlegt und so klappt es endlich:
01.
@echo off 
02.
@prompt -$G 
03.
chcp 1252 >nul 
04.
PushD %~dp0 
05.
echo. 
06.
 
07.
:Mit WMIC den Abbildpfadname eines Prozesses abfragen 
08.
 
09.
setlocal enabledelayedexpansion 
10.
for %%d in ( 
11.
	prozess1.exe 
12.
	prozess2.exe 
13.
	prozess3.exe 
14.
	prozess4.exe 
15.
	usw......exe 
16.
	) do ( 
17.
		set ExecPath= 
18.
		for /f "tokens=1*delims==" %%e in ('wmic process where "name='%%d'" get ExecutablePath /value') do ( 
19.
			for /f "delims=" %%g in ("%%~f") do ( 
20.
				set "ExecPath=%%~g" 
21.
22.
23.
		if defined ExecPath ( 
24.
			rem Abbildpfadname anzegen: 
25.
			echo Folgender Prozess wird beendet: "!ExecPath!" 
26.
			taskkill /T /F /IM %%d 
27.
			start "" "!ExecPath!" && echo Folgender Prozess ist neugestartet worden: "!ExecPath!" 
28.
			) else echo Der Prozess "%%d" wird entweder nicht oder mit eröhten Rechten ausgeführt & call :MachAnders 
29.
		echo. 
30.
31.
goto :END 
32.
 
33.
:MachAnders 
34.
echo Andere Aufgabe wird gestartet 
35.
goto :eof 
36.
 
37.
:END 
38.
:timeout /t 3 >nul 
39.
pause >nul 
40.
 
Was meinst du zu dem Aufbau? Könnte man so gelten lassen?

Gruß
evinben
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Server
gelöst Auf Server aufschalten abhängig von Kundenabfrage (7)

Frage von Todybear zum Thema Server ...

Windows 7
Computer OU auslesen bzw. abfragen (2)

Frage von mexx991 zum Thema Windows 7 ...

Netzwerkgrundlagen
gelöst Beliebigen Zeitserver auf Zeit abfragen (4)

Frage von blade999 zum Thema Netzwerkgrundlagen ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...