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.