Herausfinden, ob Batch aus der CMD gestartet wurde, oder über Windows
Hm, mir fiel kein geschickterer Titel ein, und so hat mir die Suchfunktion nicht geholfen.
Mein Problem ist eigentlich super einfach: Wenn meine Batch aus der CMD.EXE heraus gestartet wird, dann sehe ich meine Ausgaben, und alles ist super. Wenn ich einen Verknüpfung auf dem Desktop nutze, dann schließt sich aber das Fester immer gleich, und ich sehe meine Ausgabe nicht. Gibt es einen Möglichkeit, wie ich herausfinden kann, ob die Batch manuell gestartet wurde oder über einen verknüpfung, so dass ich im 2. Fall eine pause ans Ende setzen kann?
Mein Problem ist eigentlich super einfach: Wenn meine Batch aus der CMD.EXE heraus gestartet wird, dann sehe ich meine Ausgaben, und alles ist super. Wenn ich einen Verknüpfung auf dem Desktop nutze, dann schließt sich aber das Fester immer gleich, und ich sehe meine Ausgabe nicht. Gibt es einen Möglichkeit, wie ich herausfinden kann, ob die Batch manuell gestartet wurde oder über einen verknüpfung, so dass ich im 2. Fall eine pause ans Ende setzen kann?
Please also mark the comments that contributed to the solution of the article
Content-ID: 101863
Url: https://administrator.de/contentid/101863
Printed on: December 5, 2024 at 22:12 o'clock
12 Comments
Latest comment
Servus,
anstatt uns hier im trüben fischen zu lassen und einen "Workraround" zu zimmern...
Würde ich dir vorschlagen, poste die Batch dann "sieht" man eher, warum die nicht läuft, wenn Sie per Verknüpfung gestartet wird.
Aber da ich ein trüber Fischer bin, tippe ich darauf, daß entweder kein cd\ordner wo meine Batch arbeiten soll oder das Arbeitsverzeichnis im Link nicht "stimmt"
Gruß
anstatt uns hier im trüben fischen zu lassen und einen "Workraround" zu zimmern...
Würde ich dir vorschlagen, poste die Batch dann "sieht" man eher, warum die nicht läuft, wenn Sie per Verknüpfung gestartet wird.
Aber da ich ein trüber Fischer bin, tippe ich darauf, daß entweder kein cd\ordner wo meine Batch arbeiten soll oder das Arbeitsverzeichnis im Link nicht "stimmt"
Gruß
Servus again...
sorry - aber SO will ich dir nicht helfen...
Wie "eine" Batch" aussehen muß - weiß ich - wie deine - die nicht läuft wenn..
..weiß ich nicht und interessiert mich nach dieser Antwort auch nicht mehr.
Ps:
Bei aller liebe nein.
sorry - aber SO will ich dir nicht helfen...
Wie "eine" Batch" aussehen muß - weiß ich - wie deine - die nicht läuft wenn..
..weiß ich nicht und interessiert mich nach dieser Antwort auch nicht mehr.
Ps:
goto :ende
kannst du knicken - richtig heißt dasgoto ende
ohne :Ich hoffe, das kann man verstehen.
Bei aller liebe nein.
Moin Ren,
natürlich geht das.
du kannst es über die dynamische Umgebungs-Variable %CmdCmdLine% prüfen.
[Nein, ich stottere nicht, die heißt wirklich so.]
Mach folgenden Test am CMD-Prompt in einem Verzeichnis Deiner Wahl:
[Zeile eingeben und mit ENTER abschicken]
Damit hast Du einen Einzeiler, den Du bitte 1x via offenem CMD-Fenster und 1x via Explorer-Doppelklick aufrufst.
Ergebnis 1 via CMD-Fenster:
Ergebnis 2 (Aufruf via Explorer-Doppelklick; Standard *.bat-Handling laut HKCR)
--> kannst also prüfen, ob die ersten 6 Zeichen von %cmdcmdline% ="cmd /c" bzw. dem vorgeschriebenen Umgang mit Dateien mit Endung .bat/.cmd entsprechen.
Grüße
Biber
natürlich geht das.
du kannst es über die dynamische Umgebungs-Variable %CmdCmdLine% prüfen.
[Nein, ich stottere nicht, die heißt wirklich so.]
Mach folgenden Test am CMD-Prompt in einem Verzeichnis Deiner Wahl:
[Zeile eingeben und mit ENTER abschicken]
echo @echo Variablenwert ist [^%cmdcmdline^%] ^& pause>testFromWhere.bat
Ergebnis 1 via CMD-Fenster:
>testfromwhere
Variablenwert ist [C:\WINDOWS\system32\cmd.exe ]
Drücken Sie eine beliebige Taste . . .
Ergebnis 2 (Aufruf via Explorer-Doppelklick; Standard *.bat-Handling laut HKCR)
Variablenwert ist [cmd /c D:\temp\testFromWhere.bat ]
Drücken Sie eine beliebige Taste . . .
--> kannst also prüfen, ob die ersten 6 Zeichen von %cmdcmdline% ="cmd /c" bzw. dem vorgeschriebenen Umgang mit Dateien mit Endung .bat/.cmd entsprechen.
Grüße
Biber
Moin DerTiger,
ist ein bissi schwierig, dieses Problem zu lokalisieren, ohne den Wert Deiner %CMDCMDLINE% zu kennen.
Bei meinen Trockentests eben kann ich es nur nachstellen, wenn der Inhalt von %CmdCmdline% mit einem Anführungszeichen beginnt.
Bsp: [%CmdCmdline%]=["C:\Dokumente und Einstellungen\Bla.xyz"]
In diesem Fall (falls das die gegebene Ursache ist!) wäre ein Zwischenschritt im Batch nötig:
Mach bitte mal, wenn der Fehler bei Dir auftritt, ein "Echo %cmdcmdline%" am CMD-Prompt (oder in der aufgerufenen Batchdatei), bevor wir hier weiter rumraten.
Grüße
Biber
ist ein bissi schwierig, dieses Problem zu lokalisieren, ohne den Wert Deiner %CMDCMDLINE% zu kennen.
Bei meinen Trockentests eben kann ich es nur nachstellen, wenn der Inhalt von %CmdCmdline% mit einem Anführungszeichen beginnt.
Bsp: [%CmdCmdline%]=["C:\Dokumente und Einstellungen\Bla.xyz"]
In diesem Fall (falls das die gegebene Ursache ist!) wäre ein Zwischenschritt im Batch nötig:
...
:: Rem evtl umschließende Anführungszeichen entfernen
FOR /F "delims=" %%i in ("%cmdcmdline%") do set "ccline=%%~i"
IF "%ccline:~0,6%" =="cmd /c" echo Aufruf via Cmd /c
...
Mach bitte mal, wenn der Fehler bei Dir auftritt, ein "Echo %cmdcmdline%" am CMD-Prompt (oder in der aufgerufenen Batchdatei), bevor wir hier weiter rumraten.
Grüße
Biber
Hi,
@Biber das müsste eigentlich genügen gleich das Erste Zeichen beim %cmdcmdline% anzeigen wegzulassen. Aber ich komme gleich weiter unten nochmal darauf zurück ...
...auf die DynamischeVariable %cmdcmdline%
Hier das ganze nochmal als eine Zeile - ist zum "ersetzten mit" oder "hinzufügen zu" der Zeile die für den Abschluss der CMD sorgt.
Somit kommt die Nervende Pause zum Ende der Batch nicht auf der CommandLine zum vorschein.
wenn diese Aufgerufene Batch von einer Aufrufenden Batch per CALL (oder Nur) Aufgerufen wird (ohne START) - wird die Pause trotzdem ausgeführt und die Aufrufende Batch bekommt von alledem nichts mit.
Um dies zu umgehen kann eine ErstellteVariableVorDemCALL aus der Aufrufenden Batch dazu benutzt werden den Pause Befehl wieder zu deaktivieren, damit die Aufrufende Batch weiterläuft.
Diese ErstellteVariableVorDemCALL darf dann aber in der Aufgerufenen Batch NICHT Erstellt und NICHT Gelöscht werden. Auf die Veränderung der ErstellteVariableVorDemCALL in der Aufgerufenen Batch sollte verzichtet werden. Diese ErstellteVariableVorDemCALL muss nicht extra erstellt werden, wenn diese schon vor dem Aufruf existent ist.
und nun zurück zur Variable %cmdcmdline%
diese Variable wird beim Erweitern selbst Verändert und zwar zur ErweitertenVariable.
das macht zwar nichts wenn ich die Batch einmalig aufgerufen wird, weil die Variable für eine AktivesCMDFenster zu Beginn neu Erstellt wird ....but
möchte ich nun zweimal CALL von der Aufrufenden Batch ist der zweite Wert von der Variable %cmdcmdline% nicht mehr wie der erste Wert. wenn ich noch dazu in der Aufgerufenen Batch eine Pause durch das nichtsetzen von ErstellteVariableVorDemCall möchte fast das in die Grütze.
wenn ich jedoch die Variable %cmdcmdline% noch Anderweitig (zB. in der Aufrufenden Batch) benötige, stehe ich auch auf dem trockenem, also komme ich besser die Variable %cmdcmdline% in eine Andere Variable zu speichern und die Variable %cmdcmdline% dabei nicht zu verändern. Ein set "cmdcmdline=" bringt mir die OriginaleDynamik wie bei
set "date=" oder set "time=" nicht wieder zurück. ist warscheinlich eine Ausnahme bei %cmdcmdline%
demnach lautet die Optimierte Doppel-Zeile für die Automatische Pause je nach Aufruf und zusätzlicher exklusiv Pause auch aus einer anderen Batch
Gruß Phil
@Biber das müsste eigentlich genügen gleich das Erste Zeichen beim %cmdcmdline% anzeigen wegzulassen. Aber ich komme gleich weiter unten nochmal darauf zurück ...
...auf die DynamischeVariable %cmdcmdline%
Hier das ganze nochmal als eine Zeile - ist zum "ersetzten mit" oder "hinzufügen zu" der Zeile die für den Abschluss der CMD sorgt.
Somit kommt die Nervende Pause zum Ende der Batch nicht auf der CommandLine zum vorschein.
::Vor beenden der Batch bei direktaufruf "Ausführen" oder im Explorer Automatische Pause - schnipsel
if "%cmdcmdline:~ 1, 5%" == "md /c" (pause & goto :eof ) else goto :eof
wenn diese Aufgerufene Batch von einer Aufrufenden Batch per CALL (oder Nur) Aufgerufen wird (ohne START) - wird die Pause trotzdem ausgeführt und die Aufrufende Batch bekommt von alledem nichts mit.
Um dies zu umgehen kann eine ErstellteVariableVorDemCALL aus der Aufrufenden Batch dazu benutzt werden den Pause Befehl wieder zu deaktivieren, damit die Aufrufende Batch weiterläuft.
if "%cmdcmdline:~ 1, 5%" == "md /c" (if defined ErstellteVariableVorDemCall (goto :eof ) else pause & goto :eof ) else goto :eof
und nun zurück zur Variable %cmdcmdline%
diese Variable wird beim Erweitern selbst Verändert und zwar zur ErweitertenVariable.
das macht zwar nichts wenn ich die Batch einmalig aufgerufen wird, weil die Variable für eine AktivesCMDFenster zu Beginn neu Erstellt wird ....but
möchte ich nun zweimal CALL von der Aufrufenden Batch ist der zweite Wert von der Variable %cmdcmdline% nicht mehr wie der erste Wert. wenn ich noch dazu in der Aufgerufenen Batch eine Pause durch das nichtsetzen von ErstellteVariableVorDemCall möchte fast das in die Grütze.
wenn ich jedoch die Variable %cmdcmdline% noch Anderweitig (zB. in der Aufrufenden Batch) benötige, stehe ich auch auf dem trockenem, also komme ich besser die Variable %cmdcmdline% in eine Andere Variable zu speichern und die Variable %cmdcmdline% dabei nicht zu verändern. Ein set "cmdcmdline=" bringt mir die OriginaleDynamik wie bei
set "date=" oder set "time=" nicht wieder zurück. ist warscheinlich eine Ausnahme bei %cmdcmdline%
demnach lautet die Optimierte Doppel-Zeile für die Automatische Pause je nach Aufruf und zusätzlicher exklusiv Pause auch aus einer anderen Batch
set "linecmdline=%cmdcmdline%"
if "%linecmdline:~ 1, 5%" == "md /c" (if defined ErstellteVariableVorDemCall (goto :eof ) else pause & goto :eof ) else goto :eof
Gruß Phil