Ich wäre hilfreich gewesen, wenn Sie einen Link zu etwas eingefügt hätten, der die von Ihnen verwendete Technik erklärt. Zum Glück bin ich mit der Technik vertraut.
Sie versuchen, mithilfe der Variablenerweiterung Suchen / Ersetzen einen Kommentar in einen String einzufügen, sodass Sie den Anfang des Strings bis zu einem Teilstring extrahieren können. Ich bin eher mit der Verwendung vertraut REM
, aber Ihre Verwendung eines :
Labels als Pseudokommentar sollte ebenfalls funktionieren.
Ich zeige Ihnen kurz, wie das funktionieren kann. Ich habe ECHO ON
strategische Ziele, damit Sie sehen können, wie die Substitution funktioniert. Dies erfordert, dass ich REM
anstelle von verwenden, :
weil Labels nicht ECHOed sind.
@echo off setlocal set "var=String Before<split here>String After" echo on set "Before=%var:<split here>="&rem % @set before set "After=%var:*<split here>=%" @set after
--AUSGABE--
C:\test>set "Before=String Before" & rem String After Before=String Before C:\test>set "After=String After" After=String After
Die zusätzlichen Leerzeichen um die &
sind ein Artefakt der Art, wie cmd.exe die Zeile wiedergibt, sie werden durch das Finden / Ersetzen nicht wirklich eingeführt. Sie sollten jedoch in der Lage sein zu sehen, wie die Technik funktioniert.
Ich verstehe nicht, warum Sie Kommas und Anführungszeichen in Ihre Suchzeichenfolge eingefügt haben - sie sind nicht in Ihrer Startzeichenfolge enthalten, sodass nichts ersetzt wird.
Es ist wichtig, dass Sie Anführungszeichen verwenden, wenn Sie den Anfangswert von speichern %~1
, um sich vor Giftzeichen zu schützen.
Schließlich ist es auch wichtig, Anführungszeichen in Ihren nachfolgenden Aufgaben zu haben. Das erste Anführungszeichen steht vor dem Variablennamen, und das schließende Anführungszeichen wird durch den Ersetzungsausdruck unmittelbar vor dem Variablennamen eingefügt &:
.
Da Sie :
stattdessen verwenden REM
, ist es nicht erforderlich, nach dem Zeichen ein Leerzeichen einzufügen :
.
Hier ist Arbeitscode. Beachten Sie, dass ich die var
Verwendung einer zusätzlichen Variablen durch Verwendung Back
der temporären Werte eliminiert habe, bis ich den endgültigen Back-Wert erhalten kann.
@echo off setlocal call :extract "Hello there this is a block: [C]Inside of Block[/C] Did you like it?" echo Front = "%Front%" echo Inside = "%Inside%" echo Back = "%Back%" exit /b :extract set "Back=%~1" set "Front=%Back:[C]="&:% set "Back=%Back:*[C]=%" set "Inside=%Back:[/C]="&:% set "Back=%Back:*[/C]=%" exit /b
-- AUSGABE --
Front = "Hello there this is a block: " Inside = "Inside of Block" Back = " Did you like it?"
Beachten Sie meine Verwendung von Anführungszeichen in der Ausgabe - sie stehen nicht in den tatsächlich gespeicherten Werten. Sie werden vielmehr vom ECHO-Befehl eingeführt, um die Existenz des nachgestellten / führenden Raums zu zeigen, und sie würden auch vor Giftfiguren schützen.
Die obige Technik hat einige Einschränkungen:
- Der
%~1
Wert sollte keine Anführungszeichen enthalten. Andernfalls besteht die Gefahr, dass Giftzeichen das Ergebnis beschädigen - Der
%~1
Wert darf keine Zeilenvorschub (0x0A) oder Wagenrücklauf (0x0D) enthalten. - Der Teil, die Sie (ersetzen
[C]
und[/C]
in Ihrem Fall) muß beginnen, nicht mit~
,*
oder%
. - Die Teilzeichenfolgen, die Sie ersetzen, dürfen sich an keiner
=
Stelle befinden
Hier ist eine völlig unabhängige JREPL.BAT-Lösung
Wenn Sie gerne mit regulären Ausdrücken arbeiten, können Sie meine JREPL.BAT verwenden - ein reines Skript-Dienstprogramm (Hybrid-JScript / Batch), das nativ auf einem Windows-Computer ab XP ausgeführt wird, ohne dass eine EXE-Datei eines Drittanbieters erforderlich ist.
Die JREPL-Lösung ist für diese Anwendung etwas langsamer als die reine Stapelverarbeitung, hat jedoch zwei große Vorteile:
- Die Logik ist klarer, solange Sie reguläre Ausdrücke verstehen
- Es gibt keine Zeichenbeschränkungen.
%~1
Es kann immer noch kein Wagenrücklauf oder Zeilenvorschub enthalten. Aber eine Variable kann und JREPL wird mit diesen Zeichen gut funktionieren.
Wenn Sie nur einen einzelnen Wert extrahieren müssen, ist die Lösung sehr einfach - JREPL kann das Ergebnis in einer Umgebungsvariablen speichern. Der folgende Code erfasst den Wert in Ihrem Block:
@echo off setlocal call :extract "Hello there this is a block: [C]Inside of Block[/C] Did you like it?" echo Inside = "%Inside%" exit /b :extract set "Inside=%~1" call jrepl "\[C](.*)\[/C]" "$txt=$1" /s Inside /jmatchq /rtn Inside exit /b
-- AUSGABE --
Inside = "Inside of Block"
Sie möchten jedoch 3 Werte erfassen. Sie können drei separate JREPL-Aufrufe durchführen, aber das wäre ineffizient. Im folgenden Code VariableName=
füge ich an den entsprechenden Stellen Newlines ein und lasse FOR /F
die drei Ergebnisse iterieren und speichern.
@echo off setlocal call :extract "Hello there this is a block: [C]Inside of Block[/C] Did you like it?" echo Front = "%Front%" echo Inside = "%Inside%" echo Back = "%Back%" exit /b :extract set "Front=%~1" for /f "delims=" %%A in ( 'jrepl "^|\[C]|\[/C]" "Front=|\nInside=|\nBack=" /s Front /t "|" /xseq' ) do set "%%A" exit /b
-- AUSGABE --
Front = "Hello there this is a block: " Inside = "Inside of Block" Back = " Did you like it?"
Das JREPL-Dienstprogramm enthält umfangreiche Hilfe.
JREPL /?
wird alle Hilfe auflisten.JREPL /?options
wird alle verfügbaren Optionen kurz zusammenfassenJREPL /?/T
die beschreiben T ranslate Option, die ich verwendet. Sie können dasselbe für/?/XSEQ
und tun/?/S
Sie werden wahrscheinlich viele Anwendungen für JREPL finden, sobald Sie es in Ihrem Arsenal an Werkzeugen haben. JREPL glänzt wirklich bei der Bearbeitung von Textdateien - es ist viel schneller und leistungsfähiger als jede reine Batch-Lösung.