kranzfr3d
Goto Top

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. face-sad
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"  
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:
endlocal & set wichtigevar=%wichtigevar%
Aber müssen evtl. das Neben- und Hauptprogramm verändert werden?


Ich bitte um eure Hilfe - mein Dank sei euch gewiss!


MFG

Content-ID: 192268

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

Ausgedruckt am: 25.11.2024 um 18:11 Uhr

Dani
Dani 05.10.2012 um 11:07:00 Uhr
Goto Top
Moin,
les dir die Antwort von Biber durch.


Grüße,
Dani
andimue
andimue 05.10.2012 um 11:24:04 Uhr
Goto Top
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):

@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
pieh-ejdsch
pieh-ejdsch 05.10.2012 aktualisiert um 12:39:12 Uhr
Goto Top
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:
>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
Wobei Start aber etwas eigenes an sich hat.
[/edit]

Gruß Phil