Как экранировать "эхо" для хранения в файле? - PullRequest
5 голосов
/ 18 марта 2012

Я знаю: echo "blah blah" >file.txt работает.и что echo "" >file.txt тоже работает.

но что, если я хочу отобразить в файле только ОДНУ " (двойную кавычку).

echo ">file.txt не работает,Возможно ли сделать это в одной строке команды?

Ответы [ 2 ]

7 голосов
/ 18 марта 2012

Экранирующий символ для оболочки Windows - ^, поэтому:

echo ^" > file.txt
4 голосов
/ 19 марта 2012

Кавычку не нужно экранировать, чтобы повторить ее, но символы, появляющиеся после 1-й кавычки, будут считаться заключенными в кавычки, даже если закрывающей кавычки нет, поэтому конечное перенаправление не будет работать, если кавычка не экранирована.

Просто перенаправить эхо одной цитаты в файл без экранирования - просто переместите перенаправление на передний план.

>file.txt echo "

Полный ответ немного сложен, потому что система котировок является конечным автоматом. Если в данный момент «выключено», то следующая цитата включает его, если кавычка не экранирована как ^". Когда машина котировок «включена», следующая цитата всегда будет отключать ее - экранировать цитату невозможно.

Вот небольшая демонстрация

@echo off
:: everything after 1st quote is quoted
echo 1) "this & echo that & echo the other thing
echo(

:: the 2nd & is not quoted
echo 2) "this & echo that" & echo the other thing
echo(

:: the first quote is escaped, so the 1st & is not quoted.
:: the 2nd & is quoted
echo 3) ^"this & echo that" & echo the other thing
echo(

:: the caret is quoted so it does not escape the 2nd quote
echo 4) "this & echo that^" & echo the other thing
echo(

:: nothing is quoted
echo 5) ^"this & echo that^" & echo the other thing
echo(

А вот и результаты

1) "this & echo that & echo the other thing

2) "this & echo that"
the other thing

3) "this
that" & echo the other thing

4) "this & echo that^"
the other thing

5) "this
that"
the other thing

Добавление

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

@echo off
setlocal enableDelayedExpansion

:: Define a quote variable named Q. The closing quote is hidden from the
:: quoting state machine, so everything is quoted.
set Q="
echo 6) "this & echo that!Q! & echo the other thing
echo(

:: The !"! variable does not exist, so it is stripped after all quoting
:: has been determined. It functions as a phantom quote to counteract
:: the closing quote, so everything is quoted.
echo 7) "this & echo that"!"! & echo the other thing

Результаты

6) "this & echo that" & echo the other thing

7) "this & echo that" & echo the other thing
...