1

Я пытаюсь проверить, если строка содержит строку текста с циклом for, а затем удалить эту строку, если она есть.

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
    )

Проблема в том, что следующая концепция не работает внутри цикла for:

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

И заменить % s на !кажется, не работает.

1 ответ1

3

Вам нужно задержать расширение при установке и использовании переменной внутри (блок кода)

Это будет eat восклицательные знаки в вашем тексте.

:: 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]=!   
)

ПРАВКА, чтобы напомнить, что использование for /f имеет некоторые подводные камни:

  • Обработайте следующий файл test.txt с вышеуказанным пакетом

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

Образец вывода:

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

Так что же случилось:

  • замена [B] была сделана, но
  • отступ потерян,
  • пустая строка исчезла
  • строка, начинающаяся с точки с запятой также.

Существует различие между использованием "delims=" и "tokens=*"

  • при установке разделителя на ноль вся строка обрабатывается без изменений.
  • использование всех токенов (*) делает то, на что это похоже, но разделитель по умолчанию Пробел перед первым токеном удаляется (или несколько, так как они считаются одним), поэтому это объясняет, почему отступ удаляется.
  • удаление пустых строк - это общее поведение, которое можно обойти - с нумерованными строками - см. следующий пакетный файл
  • for /f поддерживает символ end of line который по умолчанию является точкой с запятой в самом первом столбце. Если это проблема, определите Eol= который, скорее всего, не будет мешать тексту, как вертикальная черта |

Этот, не сильно отличающийся, пакетный файл позволяет избежать перечисленных ловушек с использованием команды find с /V и наиболее маловероятной строки в тексте и нумерует все строки, поэтому они не пусты для for /f ; чтобы удалить число, в котором установлен разделитель ] возникает риск, что этот символ в первом столбце (столбцах) также будет удален.

:: 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(
)

Образец вывода:

> .\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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .