randolph
Goto Top

Rückgabe String aus Subroutine geht nicht !

Hallo allerseits,

ich kämpfe damit einen String aus einer Subroutine an die aufrufende Routine zurückzugeben.
Kann mir jemand sagen was ich falsch mache ?

String aus der Subroutine soll über call-paramter %3 zurückgegeben werden.

@ECHO off 
SETLOCAL

SET "searchstring1='CONTACT_FORMAT_GREETING_COMMON',"  
SET "searchstring2=CONTACT_FORMAT_GREETING_MR',"  
SET "linestart=START"  

FOR /f "delims=" %%i IN (inputfile.txt) DO (  
	SET "textline=%%i"  
	SETLOCAL enabledelayedexpansion
	if "!textline!" neq "!textline:%searchstring1%=!" (  
		CALL :findString "!textline!" %searchstring1% %linestart%  
		echo !linestart!
		REM Write the modified line
		) ELSE (
		REM Write the unmodified line
		)
	if "!textline!" neq "!textline:%searchstring2%=!" (  
		CALL :findString "!textline!" %searchstring2% %linestart%  
		echo !linestart!	
		REM Write the modified line
		) ELSE (
		REM Write the unmodified line
		)
	ENDLOCAL
)
GOTO :ENDE

:findString -- returns position of first occurrence of a string in another string

SETLOCAL ENABLEDELAYEDEXPANSION
set "mainstring=%1"  
set "substring=%2"  

Set "rest=!mainstring:*%substring%=!"  
echo Rest: %rest%

Set "anfang=!mainstring:%rest%=!"  
echo Anfang: %anfang%

ENDLOCAL &set "%3=!anfang!"  
GOTO :EOF

:ENDE
ECHO Done^^!

Bin für jeden Hinweis dankbar.

Grüsse
Randolph

Content-ID: 217580

Url: https://administrator.de/forum/rueckgabe-string-aus-subroutine-geht-nicht-217580.html

Ausgedruckt am: 09.04.2025 um 19:04 Uhr

rubberman
rubberman 22.09.2013 aktualisiert um 15:37:59 Uhr
Goto Top
Hallo Randolph,

so wie ich es lese, ist lediglich eine Referenz (der Variablenname) zu übergeben. Teste mit
echo !%linestart%!
da %linestart% zu START aufgelöst wird und es nach dem Aufruf eine Variable !START! geben sollte.

Grüße
rubberman
Randolph
Randolph 22.09.2013 um 15:39:08 Uhr
Goto Top
Sorry, das war eine alte Version des Codes, hier kommt die richitge:

@ECHO off 
SETLOCAL

SET "searchstring1='CONTACT_FORMAT_GREETING_COMMON',"  
SET "searchstring2=CONTACT_FORMAT_GREETING_MR',"  
SET "linestart=START"  

FOR /f "delims=" %%i IN (inputfile.txt) DO (  
	SET "textline=%%i"  
	SETLOCAL enabledelayedexpansion
	IF "!textline!" neq "!textline:%searchstring1%=!" (  
		CALL :findString "!textline!" %searchstring1% %linestart%  
		echo !linestart!
		REM Write line replacement1
		) ELSE (
				IF "!textline!" neq "!textline:%searchstring2%=!" (  
					CALL :findString "!textline!" %searchstring2% %linestart%  
					echo !linestart!	
					REM Write line replacement2
				) ELSE (
						REM Write original line
						))
ENDLOCAL
)
GOTO :ENDE

:findString -- returns left part of the string until search substring end

SETLOCAL ENABLEDELAYEDEXPANSION
set "mainstring=%1"  
set "substring=%2"  

Set "rest=!mainstring:*%substring%=!"  
echo Rest: %rest%

Set "anfang=!mainstring:%rest%=!"  
echo Anfang: %anfang%

ENDLOCAL &set "%3=!anfang!"  
GOTO :EOF

:ENDE
ECHO Done^^!

Warum klappt die Rückgabe des %3 parameters nicht ?
echo !linestart! führt immer zur Ausgabe von "START" face-sad

Randolph
bastla
bastla 22.09.2013 um 15:44:11 Uhr
Goto Top
Hallo Randolph!
Bin für jeden Hinweis dankbar.
Bitte sehr: Vermeide das Unterprogramm.

Grüße
bastla
rubberman
rubberman 22.09.2013 um 15:54:24 Uhr
Goto Top
Hallo Randolph,

wie oben beschrieben
echo !%linestart%!
statt
echo !linestart!
Ansonsten weiß ich nicht was das Ding eigentlich macht ...

Grüße
rubberman
bastla
bastla 22.09.2013 um 15:58:57 Uhr
Goto Top
@ rubberman
Ansonsten weiß ich nicht was das Ding eigentlich macht ...
Das soll die Position eines Substrings finden, damit danach ab dieser Position der Zeileninhalt ersetzt werden kann (siehe dazu auch den Ausgangsthread) ...

Grüße
bastla
Randolph
Randolph 22.09.2013 um 23:34:45 Uhr
Goto Top
@rubberman:

Dein Vorschlag hat leider nichts geändert. Ich bin jetzt tatsächlich dem Vorschlag von bastla gefolgt und mach das ganze ohne Subroutine/Call.
Warum's nicht geht hätte ich dennoch gern gewusst.

Ich habe jetzt eine für mich funktionierende Lösung, siehe Ausgangsthread:


Beitrag könnte man demnach schliessen.
Wer macht das? Ich? Wie?

Vielen dank und viele Grüsse
Randolph
Endoro
Endoro 22.09.2013 um 23:51:22 Uhr
Goto Top
Zitat von @Randolph:
Warum's nicht geht hätte ich dennoch gern gewusst.
ENDLOCAL &set "%3=!anfang!"   
Der cmd Interpreter wertet von links nach rechts aus.
Mit dem Kommando ENDLOCAL wird der Geltungsbereich von EnableDelayedExpansion beendet.
Das heisst, wenn der Interpreter !anfang! erreicht, gelten die erweiterten Syntaxregeln mit dem Ausrufezeichen gar nicht mehr.
Aus !anfang! ist dann wieder eine 'ordinäre' Zeichenkette geworden.
lg.
106543
106543 23.09.2013 um 08:55:23 Uhr
Goto Top
Zitat von @Randolph:
Beitrag könnte man demnach schliessen.
Wer macht das? Ich? Wie?
Siehe Wie kann ich einen Beitrag als gelöst markieren?

Grüße
Exze