Hvordan kan du undslippe parenteser i Windows-batchfil?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at bruge disse kommandolinjer i en Windows-batchfil:


SET mypath="\%programfiles(x86)\%DirectorySubDirectory"
SET app2="com.estrongs.android.pop\_4.1.6.8.9.3-604\_minAPI14(armeabi^,armeabi-v7a^,x86)(nodpi)\_apkmirror.com.apk"

If Not Exist "\%mypath\%includesapk\%app2\%" (
  Rem DO SOMETHING
) ELSE (
  Rem DO SOMETHING ELSE
)


Men jeg får denne fejl:


(nodpi)\_apkmirror.com.apk was unexpected at this time.


Hvad er årsagen til denne fejlmeddelelse ved udførelsen af ​​batchfilen?

Bedste reference


Læs venligst mit svar på Hvorfor er der ingen streng output med 'echo\% var\%' efter brug af 'set var=text' på kommandolinjen? og du bør forstå, hvorfor dette virker:


SET "app2=com.estrongs.android.pop\_4.1.6.8.9.3-604\_minAPI14(armeabi,armeabi-v7a,x86)(nodpi)\_apkmirror.com.apk"


Bemærk: Det første dobbelte citat overlades til variabelt navn.


Kommandoen er SET , og argumentet er:


app2=com.estrongs.android.pop\_4.1.6.8.9.3-604\_minAPI14(armeabi,armeabi-v7a,x86)(nodpi)\_apkmirror.com.apk


som skal vedlægges i dobbelt citater for at få plads og disse tegn &()[]{}^=;!'+,`~<|> fortolkes som bogstaver.


Glem ikke at referere til miljøvariablen app2 vedlagt i dobbelt citater ved brug af \%app2\% eller aktiver forsinket ekspansion og referencevariabel app2 med !app2!. [33]


Hele argumentstrengen, der indeholder reference til miljøvariabel app2, skal normalt være indeholdt i dobbelt citater, hvis de er sammenkædet med andre strenge. Se også Sådan indstilles miljøvariabler med mellemrum? Nogle programmer som Windows Stifinder kræver en citering af fil/mappenavn i en argumentstreng i stedet for hele argumentstrengen. Kommandoen ECHO er også en undtagelse på argumentstrengsparsering fra standard på:


Command "argument 1" argument2 "argument 3 with ( and ) in string"
"Path to executableprogram.exe" "argument 1" argument2 "argument 3 with ( and ) in string"


Eksempel:


@echo off
set "mypath=\%TEMP\%"
set "app2=com.estrongs.android.pop\_4.1.6.8.9.3-604\_minAPI14(armeabi,armeabi-v7a,x86)(nodpi)\_apkmirror.com.apk"
if not exist "\%mypath\%includesapk\%app2\%" echo File \%mypath\%includesapk\%app2\% does not exist!
pause


Kommandoen IF har 4 argumentstreng.



  1. Argument 0 er selve IF kommandoen selv.

  2. Argument 1 er not.

  3. Argument 2 er exist.

  4. Argument 3 er filnavnet med fuld sti, som er \%mypath\%includesapk\%app2\%, og som skal vedlægges i dobbelt citater på grund af at der er et mellemrum og et af disse tegn &()[]{}^=;!'+,`~.



Godt, strengen \%mypath\%includesapk\%app2\% indeholder ikke mellemrum eller parenteser. Men det kan ses ved fejlfinding af batchfilen, at Windows-kommandotolkeren udvider miljøvariablerne under forbehandling af hele IF kommandolinjen før udførelse af kommandoen HVIS . Så filnavnet med den fulde sti behandlet af IF kommandoen indeholder parenteserne.


Bemærk, at det ikke betyder noget, hvad en batchfil indeholder åbnet i teksteditor. Det betyder altid, hvordan kommandolinjen eller en hel kommandoblokk begynder med ( og slutter med matchende ) ligner efter forbehandling af Windows-kommandotolker, før du udfører en kommandolinje.


Hjælp fra Windows-kommandotolk er cmd.exe at fortolke batchfilens udgang ved at køre cmd /? forklarer i sidste afsnit på sidste outputhjælpsside, når et fil- eller mappenavn skal vedlægges i dobbelt citater. En argumentstreng, der indeholder omdirigeringsoperatørerne <|>, som skal fortolkes som bogstaver, skal også vedlægges i dobbelt citater. Et fil/mappenavn kan ikke indeholde <|>.


Kommandolinjerne i batchfilen som angivet korrekt kodet:


@echo off
set "mypath=\%ProgramFiles(x86)\%MEKNYCFireMax\_Wizard"
set "app2=com.estrongs.android.pop\_4.1.6.8.9.3-604\_minAPI14(armeabi,armeabi-v7a,x86)(nodpi)\_apkmirror.com.apk"

if not exist "\%mypath\%includesapk\%app2\%" (
  echo File "\%mypath\%includesapk\%app2\%" does not exist.
  rem Other commands on missing file.
) else (
  echo File "\%mypath\%includesapk\%app2\%" exists.
  rem Other commands on existing file.
)


På begge ECHO kommandolinjer er filnavnet med den fulde sti indeholdt i dobbelt citater, som ikke blev gjort på tidligere eksempel. Årsagen er, at \%mypath\% og \%app2\% erstattes på begge ECHO kommandolinjer med strengværdierne for de to miljøvariabler under forbehandling hele kommandoblokken, der starter med (]] på IF kommandolinjen og slutter på ) på sidste kommandolinje, før kommandoen IF overhovedet udføres. Så første forekomst af ) i filnavn, der ikke er indeholdt i dobbelt citater, ville blive fortolket af Windows-kommandotolker som ende af kommandoblokken af ​​sand tilstand, og en fejlmeddelelse er resultatet. Det foregående eksempel indeholder en IF betingelse med bare kommandoen ECHO til at udføres uden en kommandolinje, der starter med (, og det er derfor sikkert at udlæse hele filnavnet uden omslutter den i dobbelt citater. Jeg anbefaler dog kraftigt at uddatere fil-/mappenavne uden/med sti ved ECHO til at konsolere vindue (ikke omdirigeret til en fil) altid indeholdt i dobbelt citater på grund af fil/mappestrengen kunne også indeholde en ampersand & som forårsager igen problemer med at blive fundet på en kommandolinie uden for en dobbelt citeret argumentstreng.