Hvorfor forårsager en bestemt Windows-batchparameter et crash?

Indlæg af Hanne Mølgaard Plasc

Problem



Indholdet af test.bat er:


setlocal EnableExtensions EnableDelayedExpansion
set param1=\%~1
echo \%param1\%


Kan nogen forklare hvorfor test.bat "^^!^^^&^^^^" gør cmd-vinduet krasjet, men test.bat "^^^&^^^^" har et forventet resultat af at indstille &^ til variabel param1?


Jeg kan gøre test.bat "pass^^!word" og jeg får det forventede resultat af pass! Word.


Opdatering: test.bat "^^!^^^^^&^^^^^^^^" fungerer. Men jeg er ikke helt sikker på hvorfor. Dette bliver fortolket til set param1=^!^^&^^^^. Hvorfor har jeg brug for ^^ foran det?

Bedste reference


Du har mange problemer, da specialtegnene bliver evalueret flere gange i dit tilfælde.


Først i kommandoen set vil den særlige tegnfase reducere din streng "^^!^^^&^^^^" til

^!^&^^

Men som forsinket ekspansion er aktiveret, og din streng indeholder et udråbstegn,

en anden fase vil blive aktiveret for at reducere karrene igen til.

!&^


På dette tidspunkt indeholder param1 !&^, du kan teste det med set param1


Men da du forsøger at ekko værdien med echo \%param1\%, udføres en anden udvidelse.

Og nu får du et problem, da \%param1\% vil udvide til !&^,

Udråbstegn markeres, da det andet udråbstegn mangler for at udvide en variabel,

ampersand vil blive behandlet som ny kommandoseparator og

Den endelige caret bliver behandlet som multiline karakter.

echo ! & ^<next line>


Det er meget sikrere at bruge den forsinkede ekspansion her, da dette aldrig ændrer indholdet, da denne fase er den sidste af parseren.


setlocal EnableDelayedExpansion
set param1=\%~1
set param1
echo !param1!


Og alle disse forklaringer kan findes på Hvordan analyserer CMD.EXE scripts?

Andre referencer 1


Det skyldes, at escape-karakteren til Windows-skalen er ^, så:


'^^ ^^^^^ &! ^^^^^^^^'


Hver ^ ^ bliver ^


Hver ^ & bliver &


Så endelig får du:


'! ^ ^^ & ^^^^'