Экранирование восклицательных знаков с задержкой расширения - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть командный файл, который я использую для поиска фрагмента текста и замены его другим. Это работает, но происходит то, что при создании «нового» файла все, что после восклицательного знака, удаляется.

Итак, оригинальный файл

Hello! I have some cheese

Просто становится

Hello

Хотя текст, который я пытаюсь заменить, в порядке.

Я понимаю, что, поскольку я использую отложенное расширение, мне нужно каким-то образом экранировать восклицательные знаки с помощью ^^!, но я не могу понять, где это сделать. Добавление его в эхо просто повторяет буквально ^^!.

Любая помощь будет оценена.

set "rootname=Common Filename"

set "replace="old">"
set "replaced="new">"


set "source="%rootname%_unqiue_suffix.txt""
set "target=Fixed\%SOURCE%"


 setlocal enableDelayedExpansion
(
   for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %source%') do (
      set "line=%%b"
      if defined line set "line=!line:%replace%=%replaced%!"
      echo(!line!
   )
) > %target%

endlocal

1 Ответ

0 голосов
/ 12 ноября 2018

Чтобы избежать потери восклицательных знаков, включайте отложенное расширение только тогда, когда оно действительно необходимо, и расширяйте обычные % переменные и for мета-переменные только тогда, когда отложенное расширение отключено:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "rootname=Common Filename"

set "replace="old">"
set "replaced="new">"

set "source=%rootname%_unqiue_suffix.txt"
set "target=Fixed\%source%"

(
    for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%source%"') do (
        set "line=%%b"
        setlocal EnableDelayedExpansion
        if defined line set "line=!line:%replace%=%replaced%!"
        echo(!line!
        endlocal
    )
) > "%target%"

endlocal

Этот код по-прежнему вызывает проблемы в случае, если переменные replace и replaced содержат ! -символы, поскольку они развернуты в процентах.

...