2017-01-07 1 views
2

grundsätzlich verwende ich nur dieses Stück, um eine Zeichenfolge in meinem var zu ersetzen, aber ich kann verschachtelte Verzögerung Erweiterung nicht richtig funktionieren. Ist das überhaupt möglich?Batch, ersetzen Sie eine Verzögerung Expansion String mit Verzögerung Expansion Parameter

set replace=!replace:!search!=!replaceVal!! 

Ich weiß was passiert, wenn es ausgeführt wird. Es stoppt nach dem ersten vollständigen Satz, der set replace=!replace:! wäre, und dann versucht es, den letzten Teil auszuführen, aber gibt es eine Möglichkeit, ihnen zu entkommen, so wird es mein Ergebnis richtig bekommen?

Antwort

1

[Beispiel]

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 

SET "search=aaa" 
SET "replace=jjj" 
IF DEFINED search (
SET "replace=xxxbbbyyybbbhhh" 
SET "search=bbb" 
SET "replaceval=kkk" 
SET REPLACE 
ECHO after... 
CALL SET "replace=%%replace:!search!=!replaceval!%%" 
SET replace 
) 

GOTO :EOF 
+0

Das Problem ist meine Suche und Ersetzung Werte basieren auf Wert, der von der Skriptausführung erhalten werden. Die eingestellten Befehle sind in einem Block. – Matthew

+0

Also? Das Beispiel zeigt, dass die Werte für 'search',' replaceval' und 'replace' in einem Block gesetzt sind. Beachten Sie, dass mit dem ersten 'set replace' (der den Wert jeder Variablen anzeigt, die' replace' startet) die Werte weder 'aaa' noch' jjj' sind. Sie wurden durch im Block zugewiesene Werte ersetzt. Die 'After'-Situation zeigt nach dem Ersetzen, noch immer kein' aaa' oder 'jjj' in Sicht, und der Wert, der innerhalb des Blocks' xxxbbbyyybbbhhh' zugewiesen wurde, wurde der innerhalb des Blocks 'bbb' zugewiesenen Zeichenfolge durch das ersetzte replaceval ersetzt innerhalb des Blocks 'kkk'. – Magoo

1

Dies solange die search und replace Werte haben keine Leerzeichen funktioniert:

for /F "tokens=1,2" %%a in ("!search! !replaceVal!") do set replace=!replace:%%a=%%b! 

Wenn diese Variablen Leerzeichen, nur eine entsprechende Trennzeichen einfügen:

for /F "tokens=1,2 delims==" %%a in ("!search!=!replaceVal!") do set replace=!replace:%%a=%%b! 
1

Ich denke, der sicherste Weg ist die Fo llowing:

for /F "delims=" %%S in (^""!search!"^") do (
    for /F "delims=" %%R in (^""!replaceVal!"^") do (
     set "replace=!replace:%%~S=%%~R!" 
    ) 
) 

Also die einzigen verbleibenden Einschränkungen sind diejenigen, die sowieso für die Sub-String-Ersetzungssyntax gelten.