экранировать двойные кавычки в переменной при использовании echo | set / p = - PullRequest
0 голосов
/ 07 ноября 2018

echo|set /p= может выводить переменную без перевода строки.

Я пытаюсь зациклить текстовый файл, как это

for /f %%a in (zen.txt) do (
    set var=%%a
    echo !var!
    echo|set /p=!var!
)

Есть несколько строк только с одной ", например:

"he said...

echo выводит строку, как указано выше, в то время как echo|set /p= ничего не выводит.

Можно ли избежать двойных кавычек в переменной при использовании echo|set /p=.

Ответы [ 2 ]

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

set /p немного неприятно с обработкой пробелов, кавычек и знаков равенства.

Кавычка в начале или конце должна быть удвоена, НО, если вы хотите отобразить кавычки, выражение также должно быть заключено в кавычки.

Для отображения одинарной кавычки используйте

<nul set /p ="""

set /p, кажется, лишает один раз внешние кавычки.

Ваш код можно изменить на <NUL set /p="!var!", который должен работать как с обычным текстом, так и с кавычками.

Если текст начинается с пробелов, они будут удалены. (Но не до XP, там set /p "= Hello" показывает пробелы).

set /p, кажется, использует для удаления цитаты два раза. Сначала для расширенного синтаксиса набора
<nul set /p "=hello" Text after the last quote will be dropped

Но и для контента, внешние кавычки будут отброшены <nul set /p ="hello" Text after the last quote will be dropped

И даже объединяя обе работы
<nul set /p "="hello" Text after the last inner quote will be dropped "

Примечание: я использую <nul set /p, это намного быстрее, потому что версия echo | set /p использует канал и порождает два новых экземпляра cmd.exe. (Уже упоминается MC ND)

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

Нам нужно будет предоставить set/p дополнительные кавычки для потребления. Вы можете попробовать что-то вроде (без создания тестового файла, конечно)

@echo off
    setlocal enableextensions disabledelayedexpansion

    rem TESTING - Create a input file
    >zen.txt (
        echo "He said...
        echo It was not me!
        echo It was "the thing"!
        echo ...
        echo ^& it was all"  ( The end )
    )

    for /f "delims=" %%a in (zen.txt) do (
        <nul set /p="%%a "
    )

echo|set /p имитирует нажатие клавиши возврата, чтобы завершить запрос set/p, но создает отдельные экземпляры cmd для каждой стороны канала, замедляя его. <nul перенаправление ввода достаточно, чтобы получить тот же результат, но быстрее и с меньшим использованием ресурсов.

...