Variable einer CMD-Sub-Routine an Haupt-Routine zurückgeben bzw. übertragen - Wie?
Moin,
ich habe folgendes anliegen:
Ich starte von einer "Hauptprogramm.cmd" eine "Nebenprogramm.cmd".
Diese Nebenprogramm.cmd überprüft etwas, und soll die Variable der Hauptprogramm.cmd zurückgeben.
Klingt einfach, ich verzwifle aber seit geschlagenen zwei Tagen daran.
Natürlich könnte ich den Wert in eine temp. Textdatei schreiben und im Hauptprogramm wieder einlesen, das möchte ich aber nicht.
Soo, nun zur CMD:
Auszug aus der Hauptprogramm.cmd
Komplette Nebenprogramm.cmd:
So - nun zum Problem:
Obwohl "wichtigevar" am Anfang "leer" definiert wurde, existiert sie nach nicht mehr, da sie nach Beendigung der Nebenprogramm.cmd gelöscht wird.
Auch, wenn ich "künstlich" (mittels ping localhost -n 10 > nul) offen lasse, kommt die Hauptprogramm.cmd nicht an die Variable ran.
Nun die Frage: Wie kommt die Veriable wieder "wohlbehalten" ins Hautprogramm zurück?
Ich habe mich schon informiert und meine, die Lösung liegt irgenwie hier begraben in der Nebenprogramm.cmd:
Aber müssen evtl. das Neben- und Hauptprogramm verändert werden?
Ich bitte um eure Hilfe - mein Dank sei euch gewiss!
MFG
ich habe folgendes anliegen:
Ich starte von einer "Hauptprogramm.cmd" eine "Nebenprogramm.cmd".
Diese Nebenprogramm.cmd überprüft etwas, und soll die Variable der Hauptprogramm.cmd zurückgeben.
Klingt einfach, ich verzwifle aber seit geschlagenen zwei Tagen daran.
Natürlich könnte ich den Wert in eine temp. Textdatei schreiben und im Hauptprogramm wieder einlesen, das möchte ich aber nicht.
Soo, nun zur CMD:
Auszug aus der Hauptprogramm.cmd
@echo off & setlocal enabledelayedexpansion
:: Variablendeklaration
set wichtigevar=
:: Überprüfung
Start /min /WAIT "name_Nebenprogramm" "Nebenprogramm.cmd"
if "%wichtigevar%"==etwas goto etwas_irgendwohin
if "%wichtigevar%"==wasanderes goto wasanderes_irgendwohin
goto check_failed
###schnipp###
Komplette Nebenprogramm.cmd:
@echo off & setlocal enabledelayedexpansion
schleifenüberprüfung mit DO (set wichtigevar=%%i)
if wichtigevar=="bliblubb" set wichtigevar=etwas
if wichtigevar=="blubbblubb" set wichtigevar=wasanderes
exit
So - nun zum Problem:
Obwohl "wichtigevar" am Anfang "leer" definiert wurde, existiert sie nach
Start /min /WAIT "name_Nebenprogramm" "Nebenprogramm.cmd"
Auch, wenn ich "künstlich" (mittels ping localhost -n 10 > nul) offen lasse, kommt die Hauptprogramm.cmd nicht an die Variable ran.
Nun die Frage: Wie kommt die Veriable wieder "wohlbehalten" ins Hautprogramm zurück?
Ich habe mich schon informiert und meine, die Lösung liegt irgenwie hier begraben in der Nebenprogramm.cmd:
endlocal & set wichtigevar=%wichtigevar%
Ich bitte um eure Hilfe - mein Dank sei euch gewiss!
MFG
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 192268
Url: https://administrator.de/contentid/192268
Ausgedruckt am: 25.11.2024 um 18:11 Uhr
3 Kommentare
Neuester Kommentar
Ich persönlich arbeite gerne so, dass ich (wenn möglich) keine Unterprogramm-CMDs verwende sondern diese als Sub-Prozeduren in die Hauptprogramm-CMD einbaue. Damit habe ich dann keine Probleme Werte von der Unter- an die Hauptroutine zu übergeben. Natürlich ist das nicht wirklich die Antwort auf deine Frage aber vielleicht ein Denkanstoss.
Also etwas in der Art (quick & dirty):
Also etwas in der Art (quick & dirty):
@echo off
:::::::::::::::::::::::::::::::::::::::::::
:: Laenge des Inhalts einer Variablen ermitteln
:::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::
:: Hauptprogramm
:::::::::::::::::::::::::::::::::::::::::::
call :GetLength "%string%"
echo.
echo Laenge = %len%
pause
goto :EOF
:::::::::::::::::::::::::::::::::::::::::::
:: Unterprogramm
:::::::::::::::::::::::::::::::::::::::::::
:GetLength
echo WScript.Echo Len(WScript.Arguments(0))>"%Temp%\Len.vbs"
for /f %%i in ('cscript //nologo "%Temp%\Len.vbs" %1') do set Len=%%i
del "%Temp%\Len.vbs"
goto :EOF
moin,
steht in diesem Abschnitt beschrieben:
Verwenden von SETLOCAL und ENDLOCAL
Ob ein Unterprogramm eine :Marke oder ein seperater Batch ist, spielt dabei keine Rolle.
[edit]
als Test auf der CMD-Line:
Wobei Start aber etwas eigenes an sich hat.
[/edit]
Gruß Phil
steht in diesem Abschnitt beschrieben:
Verwenden von SETLOCAL und ENDLOCAL
Ob ein Unterprogramm eine :Marke oder ein seperater Batch ist, spielt dabei keine Rolle.
[edit]
als Test auf der CMD-Line:
>for %i in (start call cmd ) do @echo(&echo Befehl %i:&for /f tokens^=1^,*delims^=: %h in (' %i /? ^|findstr /n "^" ^|findstr /b [1-2]: ' ) do @echo(%i
[/edit]
Gruß Phil