Ruslan Gerasimov Ruslan Gerasimov - 1 year ago 49
Bash Question

Missing putting quote " symbol into file from windows command line or batch

I am trying to write different things to a text file from a .bat file. At every attempt to insert one quote

it results in avoiding this command, well, it looks like because it is missing
the symbol in an output file.
Here is what I am trying to do:

echo ' " '>> file.txt

It does not even work if we simply try it from CLI

echo ' " '> file.txt

I had the same issue with
from MinGW.
What is wrong here?

Answer Source

You need to escape some special characters to treat them literally. Particularly, " double quote toggles the quote flag, if the quote flag is active, the following special characters are no longer special: ^ & | < > ( ).

==> echo ' " '>> file.txt
' " '>> file.txt

==> type file.txt
The system cannot find the file specified.

==> echo ' ^" '>> file.txt

==> type file.txt
' " '

Next script shows some escaping rules for ECHO command; note different output (and rules for caret and exclamation mark) if Delayed Expansion is disabled or enabled:

@setlocal disabledelayedexpansion
@Call :ouputOnly
@Echo .
@setlocal enabledelayedexpansion
@Call :ouputOnly
@GOTO :eof
@Echo ^@  - At Symbol: be less verbose
@Echo ^~  - Tilde: Parameter Expansion as in Call subroutines, FOR loops etc.
@Echo ^&  - Single Ampersand: used as a command separator
@Echo ^&^& - Double Ampersand: conditional command separator (if errorlevel 0)
@Echo ^|^| - Double Pipe: conditional command separator (if errorlevel ^> 0)
@Echo ^:^: - Double Colon: alternative to "rem" for comments outside of code blocks
@Echo ^^  - Caret: general escape character in batch
@Echo ^"  - Double Quote: surrounding a string in double quotes 
@Echo      escapes all of the characters contained within it
@Echo ^() - Parentheses: used to make "code blocks" of grouped commands
@Echo %%  - Percentage Sign: are used to mark three of the four variable types
@Echo ^^!  - Exclamation Mark: to mark delayed expansion environment variables ^^!var^^!
@Echo ^*  - Asterisk: wildcard matches any number or any characters
@Echo ^?  - Question Mark: matches any single character
@Echo ^.  - Single dot: represents the current directory
@Echo ^.. - Double dot: represents the parent directory of the current directory
@Echo ^\  - Backslash: represent the root directory of a drive dir ^\
@Echo ^|  - Single Pipe: redirects the std.output of one command
@Echo      into the std.input of another
@Echo ^NUL (File like device): is like a bottomless pit
@Echo ^CON (File like device): is a file like device that represents the console
@Echo ^>  - Single Greater Than: redirects output to either a file or file like device
@Echo ^>^> - Double Greater than: output will be added to the very end of the file
@Echo ^<  - Less Than: redirect the contents of a file to the std.input of a command
@Echo      Stream redirection: regarding the less and greater than symbols
@echo caret^^       "caret^"
@echo caret^^^^ bang^^! "caret^^ bang^!"
@exit /B
@rem based on (dead link nowadays)