marcimarc85
Goto Top

Bin-Pfad Ende ausschneiden

ich habe per cmd/ batch einen Pfad ausgelesen. Bsp.: C:\Programme\tools\application.exe

nun möchte ich bei mehreen Diensten die exe-Datei aus dem ausgelesenen Pfad ausschneiden, um sie in einer Variablen zu nutzen. Also das nur noch "application.exe" übrig bleibt.

Die Pfade sind unterschiedlich lang. Ich weiß, dass es ein Kommando gibt, womit man die den letzten Teil eines Pfades ausschneiden kann. dieser fällt mir aber aktuell nicht ein.

Content-Key: 417667

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

Printed on: April 23, 2024 at 16:04 o'clock

Member: falscher-sperrstatus
falscher-sperrstatus Feb 14, 2019 at 10:26:43 (UTC)
Goto Top
split
?
explode
?

VG
Member: MarciMarc85
MarciMarc85 Feb 14, 2019 at 10:39:07 (UTC)
Goto Top
Dankeschön. das wars.

Lässt sich das Fanze irgendwie zusammenbauen.

Also ich möchte, dass das Batch Script prüft, ob ein bestimmter Dienst, die eine Software benötigt (das sind einige) noch läuft und wenn er läuft, soll der entsprechende Task dazu beendet werden (nicht "gekilled").

Es soll also überprüft werden, welche Dienste mit dem Namen TOOL* ( die Dienste beginnen alle mit TOOL gefolgt von einem "-" oder einem Leerzeichen und dem Teil der Anwendnung) . Beispiel "TOOL-Auswertung" oder "TOOL Verarbeitung" im Status "Running" sind und diese sollen dann beendet werden. Dabei soll die Taskliste abgefragt werden und so lange warten, bis die exe-Datei hinter dem Dienst ordnungsgemäß beendet ist
Member: erikro
erikro Feb 14, 2019 at 10:40:49 (UTC)
Goto Top
Moin,

in einem batch ist das so einfach nicht. Hier findest Du zwei Lösungsansätze:
https://stackoverflow.com/questions/1707058/how-to-split-a-string-by-spa ...
https://stackoverflow.com/questions/34524390/regex-to-match-a-variable-i ...

Ich würde da die Powershell bevorzugen, da das viel einfacher ist:

split-path C:\Programme\tools\application.exe -leaf

Oder, wenn Du mehrere im selben Verzeichnis hast:

split-path C:\Programme\tools\*.exe -leaf -resolve

hth

Erik
Member: MarciMarc85
MarciMarc85 Feb 14, 2019 at 10:45:05 (UTC)
Goto Top
Powershell wäre auch eine option. Vielleicht lässt sich darüber mein gesamtvorhaben aus der letzten Antwort von mir, auch wesentlich leichter umsetzten?
Member: erikro
erikro Feb 14, 2019 at 11:07:03 (UTC)
Goto Top
Moin,

Zitat von @MarciMarc85:
Es soll also überprüft werden, welche Dienste mit dem Namen TOOL* ( die Dienste beginnen alle mit TOOL gefolgt von einem "-" oder einem Leerzeichen und dem Teil der Anwendnung) . Beispiel "TOOL-Auswertung" oder "TOOL Verarbeitung" im Status "Running" sind und diese sollen dann beendet werden. Dabei soll die Taskliste abgefragt werden und so lange warten, bis die exe-Datei hinter dem Dienst ordnungsgemäß beendet ist

Na das ist ja mit der PS ganz einfach:

stop-service -displayname "TOOL*"  

und am Ende, falls das notwendig ist

start-service -displayname "TOOL*"  

hth

Erik
Member: MarciMarc85
MarciMarc85 Feb 14, 2019 updated at 11:24:25 (UTC)
Goto Top
ich hab es jetzt folgendermaßen gelöst, was auch zu funktionieren scheint:

Get-WmiObject win32_service | ?{($_.Name -like '*TOOL*')-and ($_.State -eq "Running")} | Stop-Service  

Die Frage ist nur, werden die Dienste "ordentlich" beendet , oder einfach abgeschossen? es gibt nämlich einen Dienst, der braucht nen kleinen Augenblick zum beenden, bis er auch aus der taskliste verschwindet: Würd eman den einfach abschießen, kann es möglich sein, dass eine Projektdatei nicht richtig gespeichert wird und man beim nächsten Programmstart eine neu Kopie des Projektes aus der Datenbank laden muss.

Kann man da irgendwie noch eine Überprüfung einbauen, die auf die Taskliste schaut?

per Batch hat es der Kollege vor mir so gemacht:

if defined _tool_service_name1 (
   echo shutting down %_tool_service_name1%
   net stop %_tool_service_name1%  > nul  2>&1 
)
:waitforservice_tool
if defined _tool_service_name1 (
   tasklist /fi "imagename eq %_tool_exe%" 2>nul | find /i /n "%_tool_exe:~0,25%" >nul  
   if %errorlevel%==0 goto waitforservice_tool
)

In dem fall war aber die exe-Datei zum jeweiligen diesnt in einer eigenen Variable in einer weiteren batch-Datei hinterlegt. Ich möchte halt, dass das script die laufenden Dienste mit dem bestimmten Inhalt im Namen erkennt und runterfährt.
Member: erikro
Solution erikro Feb 14, 2019 at 11:38:06 (UTC)
Goto Top
Moin,

Zitat von @MarciMarc85:
Get-WmiObject win32_service | ?{($_.Name -like '*TOOL*')-and ($_.State -eq "Running")} | Stop-Service  

Eigentlich kannst Du Dir das sparen, zu prüfen, ober der Dienst läuft, weil stop-service ja nur Dienste stoppt, die auch laufen. Wenn Du das gerne vorher möchtest, dann geht auch das einfacher:

get-service -displayname TOOL* | where-object {$_.status -eq running} | stop-service

Liebe Grüße

Erik
Member: MarciMarc85
MarciMarc85 Feb 14, 2019 at 12:29:25 (UTC)
Goto Top
Mir ist gerade noch eingefallen, dass ein bestimmter Dienst von denen zuerst beendet werden muss. kann ich das irgendwie in der Abfrage sortieren?
Member: falscher-sperrstatus
falscher-sperrstatus Feb 14, 2019 at 13:15:15 (UTC)
Goto Top
Hirn einschalten, das bekommst du hin ;)
Member: MarciMarc85
MarciMarc85 Feb 14, 2019 at 13:25:06 (UTC)
Goto Top
Wenn ich auf der Arbeit nur nebenbei so viel Zeit hätte, würde ich nicht fragen müssen ;)
Member: erikro
erikro Feb 14, 2019 updated at 13:46:27 (UTC)
Goto Top
Zitat von @MarciMarc85:

Wenn ich auf der Arbeit nur nebenbei so viel Zeit hätte, würde ich nicht fragen müssen ;)

Ach, aber wir haben nebenbei so viel Zeit, Deine Arbeit zu machen? face-wink

Ich würde das so lösen:

get-service -displayname Tool-das-zuerst-runter-muss | stop-service

Und dann weiter wie oben.

hth

Erik
Mitglied: 138810
138810 Feb 14, 2019 updated at 14:45:44 (UTC)
Goto Top
Zitat von @MarciMarc85:
dass ein bestimmter Dienst von denen zuerst beendet werden muss. kann ich das irgendwie in der Abfrage sortieren?
get-service -displayname TOOL*  | %{$_.DependentServices | stop-service -Force; $_ | stop-service -Force}
Member: erikro
erikro Feb 14, 2019 at 14:44:10 (UTC)
Goto Top
Zitat von @138810:

Zitat von @MarciMarc85:
dass ein bestimmter Dienst von denen zuerst beendet werden muss. kann ich das irgendwie in der Abfrage sortieren?
> get-service -displayname TOOL*  | ${$_.DependentServices | stop-service; $_ | stop-service}
                                    ^------------- Das sollte wohl ein % werden ;-)
> 
Mitglied: 138810
138810 Feb 14, 2019 updated at 14:44:52 (UTC)
Goto Top
Jopp. Merci.