Jak używać ! w edytuj / zamień kod na partię pętli


1

Próbuję przetestować, czy linia zawiera ciąg tekstu z pętlą for, a następnie usunąć ten ciąg, jeśli istnieje.

for /F "tokens=*" %%A in  (test.txt) do (
    echo %%A | findstr /C:"[B]" 1>nul
    if !errorlevel!==1 echo %%A
    if !errorlevel!==0 SOMEHOW REMOVE [B] AND ECHO IT WITHOUT THE B
    )

Problem polega na tym, że poniższa koncepcja nie działa w pętli for:

set var=[B]Hello
set Va2r=%_var:[B]=%

I zastępując % s z ! s nie działa.

Odpowiedzi:


3

Potrzebujesz opóźniona ekspansja podczas ustawiania i użycie zmiennej wewnątrz a (bloku kodu)

To będzie eat wykrzykniki w tekście.

:: Q:\Test\2018\06\26\SU_1334338.cmd
@Echo off & Setlocal EnableDelayedExpansion
for /F "tokens=*" %%A in  (test.txt) do (
    set "line=%%A"
    Echo=!line:[B]=!   
)

EDYTUJ, aby przypomnieć, że korzystanie z for /f ma pewne pułapki:

  • Przetwórz następujący plik test.txt z powyższą partią

This line contains [ B ]   here :[B]:
   this line is indented
there is an empty line following

; this line starts with a ;
:: this is the last line

Przykładowe wyjście:

> .\SU_1334338.cmd
This line contains [ B ]   here ::
this line is indented
there is an empty line following
:: this is the last line

Więc co się stało:

  • dokonano wymiany [B], ale
  • wcięcie jest stracone,
  • pusta linia zniknęła
  • linia zaczynająca się od średnika również.

Istnieje różnica między używaniem "delims=" i "tokens=*"

  • podczas ustawiania ogranicznika na nic cała linia jest przetwarzana bez zmian.
  • użycie wszystkich tokenów (*) robi to, co brzmi, ale domyślny ogranicznik Przestrzeń przed pierwszym żetonem jest usuwany (lub wielokrotny, ponieważ są liczone jako jeden), więc wyjaśnia to, dlaczego wcięcie jest usuwane.
  • usunięcie pustych linii to ogólne zachowanie, które można obejść - z numerowanymi liniami - patrz następny plik wsadowy
  • for /f obsługuje jeden end of line znak, który domyślnie jest średnikiem w pierwszej kolumnie. Jeśli jest to problem, zdefiniuj Eol= które najprawdopodobniej nie będą kolidować z tekstem, jak pionowy pasek |

Ten niezbyt różny plik wsadowy unika wymienionych pułapek, używając find z / V i najbardziej mało prawdopodobnego wystąpienia ciągu w tekście i numeruje wszystkie linie, więc nie są puste for /f; aby usunąć liczbę ustawioną przez separator ] co pociąga za sobą ryzyko, że ten znak w pierwszej kolumnie (ach) również zostanie usunięty.

:: Q:\Test\2018\06\26\SU_1334338_2.cmd
@Echo off & Setlocal EnableDelayedExpansion
for /F "tokens=1* eol=|delims=]" %%A in  (
    'find /N /V "#+§-*;" ^< test.txt'
) do (
    set "line=%%B"
    if defined line (Echo(!line:[B]=!) else Echo(
)

Przykładowe wyjście:

> .\SU_1334338_2.cmd
This line contains [ B ]   here ::
   this line is indented
there is an empty line following

; this line starts with a ;
:: this is the last line

Próbowałem tego, ale wydawało się, że nie działa tak, jak to napisałem. Wiem, że zawsze używam Setlocal. Twój sposób działa świetnie, chociaż dziękuję.
Mark Deven

Nie mogłem powstrzymać mnie przed rozwinięciem niektórych for /f zagadnienia.
LotPings

Haha to doceniane
Mark Deven
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.