windows - Hvordan undslippe ekko 'til opbevaring i en fil?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg ved: echo "blah blah" >file.txt værker.
og at echo "" >file.txt virker også.


men hvad hvis jeg kun vil ekko en " (dobbelt citat) i en fil.


echo ">file.txt virker ikke, er det muligt at gøre det i en kommando med en linje?

Bedste reference


Escape karakteren til Windows shell er ^, så:


echo ^" > file.txt

Andre referencer 1


Citatet behøver ikke at blive rømt for at ekko det, men tegn der vises efter det første citat vil blive betragtet som citeret, selvom der ikke er et lukke citat, så den efterfølgende omdirigering ikke fungerer, medmindre citatet er undslippet.


Det er nemt at omdirigere ekkoet af et enkelt citat til en fil uden at flygte - bare flyt omdirigering til forsiden.


>file.txt echo "


Det komplette svar er lidt komplekst, fordi citatsystemet er en statsautomat. Hvis det aktuelt er 'slukket', ændrer det næste citat det til 'med', medmindre citatet er undslippet som ^". Når citatmaskine er 'tændt', vil det næste citat altid slukke for det - off quote kan ikke undslippes.


Her er en lille demonstration


@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(


Og her er resultaterne


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


Tillæg


Selvom det ikke er muligt at undslippe et afsluttende citat, er det muligt at bruge forsinket ekspansion til enten at skjule det afsluttende citat eller ellers modvirke det med et genoptagende citat.


@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


resultater


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

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