Byłbym pomocny, gdybyś zamieścił link do czegoś, co wyjaśnia technikę, której próbujesz użyć. Na szczęście znam tę technikę.
Próbujesz użyć rozwinięcia zmiennej find / replace, aby wstawić komentarz do łańcucha, abyś mógł wyodrębnić początek łańcucha, aż do jakiegoś podłańcucha. Jestem bardziej zaznajomiony z używaniem REM, ale twoje użycie :etykiety jako pseudo komentarza również powinno działać.
Pokażę szybki przykład, jak to może działać. Mam ECHO ONna liniach strategicznych, abyś mógł zobaczyć, jak działa podstawienie. Wymaga to użycia REMzamiast, :ponieważ etykiety nie są ECHOed.
@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
--WYDAJNOŚĆ--
C:\test>set "Before=String Before" & rem String After
Before=String Before
C:\test>set "After=String After"
After=String After
Dodatkowe spacje wokół &są artefaktem tego, jak cmd.exe echa linii, tak naprawdę nie są wprowadzane przez find / replace. Ale powinieneś być w stanie zobaczyć, jak działa ta technika.
Nie rozumiem, dlaczego umieściłeś przecinki i cytaty w ciągu wyszukiwania - nie ma ich w ciągu początkowym, więc nic nie zostanie zastąpione.
Ważne jest, aby używać cudzysłowów podczas zapisywania wartości początkowej, %~1aby zabezpieczyć się przed zatrutymi postaciami.
Wreszcie kluczowe znaczenie mają cytaty w kolejnych zadaniach. Pierwszy cytat znajduje się przed nazwą zmiennej, a cytat zamykający jest wprowadzany przez termin zastępujący, tuż przed &:.
Ponieważ używasz :zamiast REM, nie ma potrzeby wprowadzania spacji po :.
Oto działający kod. Zauważ, że wyeliminowałem potrzebę dodatkowej varzmiennej, używając Backwartości tymczasowych, dopóki nie będę gotowy, aby uzyskać ostateczną wartość Wstecz.
@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
- WYDAJNOŚĆ -
Front = "Hello there this is a block: "
Inside = "Inside of Block"
Back = " Did you like it?"
Zwróć uwagę na moje użycie cudzysłowów w danych wyjściowych - nie są one w rzeczywistych zapisanych wartościach. Są one raczej wprowadzane przez komendę ECHO, aby pokazać istnienie spływu / wiodącej przestrzeni, a także chroniłyby przed zatrutymi postaciami.
Powyższa technika ma kilka ograniczeń:
%~1Wartość nie powinna zawierać żadnych cytatów, inaczej ryzykujesz znaków zatruć zgorszenie wynik
%~1Wartość ta może zawierać linia (0x0A) lub powrotu karetki (0x0d).
- Podciągów że wymieniasz (
[C]i [/C]w danym przypadku) nie musi zaczynać się ~, *lub %.
- Podciągi, które zastępujesz, nie mogą zawierać
=nigdzie w nich
Oto całkowicie niepowiązane rozwiązanie JREPL.BAT
Jeśli lubisz pracować z wyrażeniami regularnymi, możesz użyć mojego JREPL.BAT - czystego narzędzia skryptowego (hybrydowy JScript / partia), które działa natywnie na dowolnym komputerze z systemem Windows od XP, nie potrzebujesz żadnego pliku .exe innej firmy.
Rozwiązanie JREPL będzie nieco wolniejsze niż czysta partia dla tej aplikacji, ale ma dwie duże zalety:
- Logika jest bardziej prosta, o ile rozumiesz wyrażenia regularne
- Nie ma limitów postaci.
%~1nadal nie może zawierać powrotu karetki ani podawania wiersza. Ale zmienna może i JREPL będzie działać dobrze z tymi znakami.
Jeśli potrzebujesz tylko wyodrębnić jedną wartość, rozwiązanie jest naprawdę proste - JREPL ma możliwość przechowywania wyniku w zmiennej środowiskowej. Poniższy kod uchwyci wartość wewnątrz twojego bloku:
@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
- WYDAJNOŚĆ -
Inside = "Inside of Block"
Ale chcesz uchwycić 3 wartości. Możesz wykonać trzy osobne wywołania JREPL, ale byłoby to nieefektywne. W poniższym kodzie wstawiam VariableName=i nowe wiersze w odpowiednich miejscach oraz pozwalam FOR /Fiterować i przechowywać trzy wyniki.
@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
- WYDAJNOŚĆ -
Front = "Hello there this is a block: "
Inside = "Inside of Block"
Back = " Did you like it?"
Obszerna pomoc jest wbudowana w narzędzie JREPL.
JREPL /? wyświetli całą pomoc.
JREPL /?options krótko podsumuje wszystkie dostępne opcje
JREPL /?/Topisze T opcję ranslate że użyłem. Możesz zrobić to samo dla /?/XSEQi/?/S
Prawdopodobnie znajdziesz wiele zastosowań JREPL, gdy już znajdziesz je w swoim arsenale narzędzi. JREPL naprawdę błyszczy, gdy chodzi o manipulowanie plikami tekstowymi - jest o wiele szybszy i potężniejszy niż każde czyste rozwiązanie wsadowe.
poisenoustakich znaków<>|&, będziesz musiał zawrzeć cały zestaw par var = wartość w podwójnych cudzysłowach ->Set "Front=%var:,"[C]"=&:%"(nie wiem, do czego służą wewnętrzne podwójne cudzysłowy).