wisch
Goto Top

Batch Kommandozeilenparameter als START Pfad mit Leerzeichen

Hallo,
habe gesucht und nicht gefunden.

Was passieren soll:
Ich möchte meine CMD mit zwei Parametern aufrufen.
Dann wird geprüft ob das Programm schon läuft, wenn nicht soll es gestartet werden.
Das funktioniert (auch dank pslist) solange, bis der Programmpfad Leerzeichen enthält.

Das hier hat nicht geklappt, ich
bekomme trotzdem eine Fehlermeldung "Pfad nicht gültig"... face-sad

Hier mein aktueller Code mit Bitte um Hilfe, danke.
@echo off 

REM Prameter von der Kommandozeile holen
set Suchname=%1 
set Programm=%2

REM Fehlt ein Parameter dann Ende
if "%1"=="" goto :ENDE 
if "%2"=="" goto :ENDE 

REM PSLIST ist ein Tool von SysInternals (http://technet.microsoft.com/de-de/sysinternals/bb896682.aspx)
REM Nur damit ist die Abfrage der Prozesse möglich.
pslist |find /i "%Suchname%" >nul 

REM Verzweigung, je nach Ergebnis
if %errorlevel% == 0 ( 
  REM Das Programm laeuft bereits und nichts wird gemacht
) else ( 
  REM Das Programm laeuft nicht und wird deshalb gestartet
  start "" /D%Programm%
)

:ENDE
exit

Content-Key: 116398

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

Printed on: April 20, 2024 at 04:04 o'clock

Member: bastla
bastla May 19, 2009 at 13:56:39 (UTC)
Goto Top
Hallo WiSch!

Und so?
@echo off & setlocal  
REM Prameter von der Kommandozeile holen 
set "Suchname=%~1"  
set "Programm=%~2"  

REM Fehlt ein Parameter dann Ende 
if not defined Programm goto :eof  

REM PSLIST ist ein Tool von SysInternals (http://technet.microsoft.com/de-de/sysinternals/bb896682.aspx) 
REM Nur damit ist die Abfrage der Prozesse möglich. 
pslist |find /i "%Suchname%" >nul    

REM Verzweigung, je nach Ergebnis 
if %errorlevel% == 0 (  
  REM Das Programm laeuft bereits und nichts wird gemacht 
) else (  
  REM Das Programm laeuft nicht und wird deshalb gestartet 
  start "" /D"%Programm%"  
) 
Noch als Anmerkung zu "Nur damit ist die Abfrage der Prozesse möglich.": Soferne Dein (nicht genanntes) BS mindestens XP ist, hättest Du auch "tasklist" zur Verfügung ...

Grüße
bastla
Member: miniversum
miniversum May 19, 2009 at 13:58:46 (UTC)
Goto Top
Ändere mal
set Programm=%2
in
set Programm="%~2"
Member: WiSch
WiSch May 19, 2009 at 14:26:05 (UTC)
Goto Top
Weder die Schreibweise
set "programm=%~2"  
noch
set programm="%~2"  

führen zum gewünschten Ergebnis.

Zum BS: Ist XP und soll auch unter Win 2003 Server laufen
"tasklist" funktioniert auch, so brauche ich wenigstens kein zusätzliches Tool, danke.

Habe es mit folgendem Aufruf am Prompt probiert:
einfachstart.cmd iexplore "C:\Programme\Internet Explorer\iexplore.exe"  

und bekomme dann folgende Meldung zurück:
Das aktuelle Verzeichnis ist ungültig.
Member: bastla
bastla May 19, 2009 at 14:30:50 (UTC)
Goto Top
Hallo WiSch!

Sorry, leider nur oberflächlich gelesen ...

Versuch es mit folgender Zeile 18:
start "" "%Programm%"
Grüße
bastla
Member: WiSch
WiSch May 19, 2009 at 14:43:08 (UTC)
Goto Top
Es läuft!

Danke, hatte dieses /D in oben verlinktem Beitrag gefunden und deshalb übernommen...

Hier das lauffähige Script "Einfachstart.cmd" wie er jetzt eingesetzt wird:

REM Prameter von der Kommandozeile holen
set "Suchname=%~1"   
set "Programm=%~2"  

REM Fehlt ein Parameter dann Ende
if not defined Programm goto :ENDE 

REM Taskliste durchsuchen nach dem zu startenden Programm
tasklist |find /i "%Suchname%" >nul   

REM Verzweigung, je nach Ergebnis
if %errorlevel% == 0 ( 
  REM Das Programm laeuft bereits: Nichts machen
) else ( 
  REM Das Programm laeuft nicht: Programm starten 
  start "" "%Programm%"  
)

:ENDE
REM exit

Aufruf z.B. so:
einfachstart iexplore "c:\programme\internet explorer\iexplore.exe"  


//Edit:
@77559: Werde Deine Empfehlungen noch berücksichtigen, aber es läuft erst einmal so und das war (zeitlich) wichtig... Danke.
Mitglied: 77559
77559 May 19, 2009 at 14:45:52 (UTC)
Goto Top
@WiSch

Ich würde ja das Vorhandensein eines notwendigen Tools überprüfen anstatt es nur im REM zu erwähnen.
Die Logik des Batches würde auch das Programm starten wenn PSList gar nicht vorhanden ist.

IMO ist es sinnvoller eine erläuternde Fehlermeldung vorzubereiten und im Fehlerfall auszugeben.
Das ist dann im Programmcode auch genauso sichtbar.

Also hier mein Vorschlag
@echo off & setlocal  
REM Prameter von der Kommandozeile holen 
set "Suchname=%~1"  
set "Programm=%~2"  

set ErrMsg=Usage: %~f0 Suchname Programm  Fehlt ein Parameter dann Ende 
if not defined Programm Echo %ErrMsg% & Pause & Exit /B 1 

set ErrMsg=PSLIST ist ein für diese Batchdatei zwingend notwendiges Tool von SysInternals.
set ErrMsg=%ErrMsg% (http://technet.microsoft.com/de-de/sysinternals/bb896682.aspx) 

(set MyPath=.;%Path%)&IF defined PSList set "PSList="  
for /F "delims=" %%A in ("pslist.exe") do set "PSList=%%~$MyPath:A"  
IF Not Defined PSList echo %ErrMsg% & Pause & Exit /B 2

set ErrMsg=Programm %Programm läuft bereits, wird nicht nochmal gestartet.
"%PSList%" |find /i "%Suchname%" >nul &&Echo %ErrMsg% & Exit /B 3  

REM Das Programm laeuft nicht und wird deshalb gestartet 
start "" /D"%Programm%"  

Gruß
LotPings