Обработка строк с использованием Batch Script - PullRequest
2 голосов
/ 18 ноября 2010

В настоящее время я создаю пакетный сценарий, который должен циклически проходить по строкам в файле, проверять наличие какой-либо строки и, если есть префикс соответствия этой строки с символом «#» (закомментировать).

Я совершенно новичок в пакетном скрипте, все, что я получил, это:

for /f %%j in (CMakeLists.txt) do (
    if "%%j"=="Extensions_AntTweakBar" (
        echo lol1
    )
    if "%%j"=="Extensions_Inspection" (
        echo lol2
    )
    if "%%j"=="Extensions_InspectionBar" (
        echo lol3
    )
)

Итак, моя текущая проблема в том, что я не знаю, как работать со строкой в ​​пакетных сценариях. Если кто-то может помочь мне, это будет оценено :)

Ответы [ 2 ]

2 голосов
/ 18 ноября 2010

Вы можете просто использовать текст, который вы хотите добавить, за которым обычно следует ваша переменная.

C:\>set MY_VAR=Hello world!
C:\>echo #%MY_VAR%
#Hello world!

C:\>set MY_VAR=#%MY_VAR%
C:\>echo %MY_VAR%
#Hello world!

Если вы просто делаете эхо, это нормально. echo #%%j сделает то, что вам нужно.

Но если вы хотите установить строку в переменную, вам нужно включить отложенное расширение . Добавьте setlocal ENABLEDELAYEDEXPANSION в начало вашего файла и затем окружите ваши переменные ! вместо %. Например (и обратите внимание, что я добавил delims=, чтобы поместить всю строку в %%j вместо первого слова в строке):

@echo off

setlocal ENABLEDELAYEDEXPANSION

set LINE=
for /f "delims=" %%j in (CMakeLists.txt) do (
    set LINE=%%j
    if "%%j"=="Extensions AntTweakBar" (
        set LINE=#%%j
    )
    if "%%j"=="Extensions Inspection" (
        set LINE=#%%j
    )
    if "%%j"=="Extensions InspectionBar" (
        set LINE=#%%j
    )

    echo !LINE!
)

Учитывая этот входной файл:

Extensions AntTweakBar
some text
Extensions Inspection
Extensions What?
some more text
Extensions InspectionBar
Extensions InspectionBar this line doesn't match because delims= takes all text
even more text

Приведенный выше скрипт выдает такой вывод:

C:\>comment.bat
#Extensions AntTweakBar
some text
#Extensions Inspection
Extensions What?
some more text
#Extensions InspectionBar
Extensions InspectionBar this line doesn't match because delims= takes all text
even more text

И, конечно же, удаление @echo off поможет вам решить проблемы.

Но, несмотря на это, вы находитесь на грани того, что вы можете сделать с помощью пакетной обработки строк. Если вы все еще хотите использовать пакетные команды, вам может потребоваться начать запись строк во временные файлы и использовать findstr с регулярным выражением.

0 голосов
/ 18 ноября 2010

Без лучшего понимания того, что вы хотите внутри цикла или как выглядит ваш файл CMakeLists.txt, попробуйте это для начала:

FINDSTR "SOMETHING" %%J && ECHO #%%J || ECHO %%J

&& делает вторую команду (ECHO) условнойпо первой команде, выходящей без состояния ошибки, и ||это как логическое ИЛИ, и оно запускается, когда первое не выполняется.

Действительно, для изменения внутренних частей текстового файла вам, вероятно, будет гораздо лучше использовать либо sed или awk - двоичные файлы win32 можно найти в проекте UnxUtils .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...