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 ON
na liniach strategicznych, abyś mógł zobaczyć, jak działa podstawienie. Wymaga to użycia REM
zamiast, :
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, %~1
aby 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 var
zmiennej, używając Back
wartoś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ń:
%~1
Wartość nie powinna zawierać żadnych cytatów, inaczej ryzykujesz znaków zatruć zgorszenie wynik
%~1
Wartość 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.
%~1
nadal 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 /F
iterować 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 /?/T
opisze T opcję ranslate że użyłem. Możesz zrobić to samo dla /?/XSEQ
i/?/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.
poisenous
takich 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).