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-Key: 217580

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

Printed on: April 19, 2024 at 09:04 o'clock

Member: rubberman
rubberman Sep 22, 2013 updated at 13:37:59 (UTC)
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
Member: Randolph
Randolph Sep 22, 2013 at 13:39:08 (UTC)
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
Member: bastla
bastla Sep 22, 2013 at 13:44:11 (UTC)
Goto Top
Hallo Randolph!
Bin für jeden Hinweis dankbar.
Bitte sehr: Vermeide das Unterprogramm.

Grüße
bastla
Member: rubberman
rubberman Sep 22, 2013 at 13:54:24 (UTC)
Goto Top
Hallo Randolph,

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

Grüße
rubberman
Member: bastla
bastla Sep 22, 2013 at 13:58:57 (UTC)
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
Member: Randolph
Randolph Sep 22, 2013 at 21:34:45 (UTC)
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
Member: Endoro
Endoro Sep 22, 2013 at 21:51:22 (UTC)
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.
Mitglied: 106543
106543 Sep 23, 2013 at 06:55:23 (UTC)
Goto Top
Zitat von @Randolph:
Beitrag könnte man demnach schliessen.
Wer macht das? Ich? Wie?
Siehe How can I mark a post as solved?

Grüße
Exze