windows - Fortæl batch script at ikke acceptere variabler, der indeholder citatmærker

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at få et batch script til ikke at acceptere citatmærker som acceptable variabler.


For eksempel:


:setmyvar
set /P myvariable=
if /i \%myvariable\%==<anything containing one or more "> goto bad
goto success

:bad
echo Variable cannot contain quotation marks.
pause
goto setmyvar

:success
echo Success!


Så jeg grundlæggende, uanset hvad variablen er, hvis den endda har et citatmærke (ja, selv inden for et ord som:


exa"mple


Det accepterer ikke det og beder brugeren om at indtaste noget andet.


tak skal du have

Bedste reference


Følgende kode kan bruges til at tjekke input af bruger:


@echo off
setlocal EnableExtensions EnableDelayedExpansion

:setmyvar
set "myvariable=""
set /P "myvariable=Please enter: "
set "TestVar=!myvariable:"=!"

if not defined TestVar goto setmyvar

if not "!TestVar!" == "!myvariable!" (
    echo/
    echo Variable cannot contain quotation marks.
    echo/
    pause
    echo/
    goto setmyvar
)

echo Success^^!
rem Other commands.
endlocal


Inden brugeren bliver bedt om, defineres miljøvariablen myvariable med et dobbelt citat. Hvis brugeren bare rammer RETURN eller ENTER , holder miljøvariablen myvariable sin nuværende værdi (eller er stadig ikke defineret, hvis den ikke er defineret før).


Efter brugerprompt er en ny miljøvariabel TestVar defineret med værdien af ​​miljøvariabel myvariable, men med alle dobbelte citater fjernet.


Der er nu tre muligheder:



  1. TestVar er ikke defineret på nuværende tidspunkt, da brugeren ikke indtaste noget eller bare dobbelt citater.

  2. TestVar er forskellig fra myvariable som myvariable indeholder blandt andet også 1 eller flere dobbelt citater.

  3. TestVar er lig med myvariable, da brugeren indtaste en streng, der ikke indeholder et dobbelt citat.



Det er nødvendigt at sammenligne ikke lige miljøvariabler for at bruge forsinket ekspansion som ellers med umiddelbar miljøvariabel ekspansion \%myvariable\% med dobbelt citater ville resultere i en syntaksfejl. [40]


I første omgang bliver brugeren simpelthen bedt om igen.


I andet tilfælde informeres brugeren om kravet om at indtaste strengen uden citatmærker, og så kan man igen indtaste strengen, hvorved brugeren kan bruge OPPÆNP for at hente tidligere indtastede strenger og redigere den.


Og i tredje tilfælde fortsætter batchfilens udførelse.


Udråbstegn i tekst til udgang med echo skal undgås med to kørsler på grund af forsinket udvidelse er stadig aktiveret efter behov for den resterende kode for at få adgang til værdien på myvariable. Efter endlocal eksisterer miljøvariabel myvariable ikke længere, medmindre følgende kommandolinje anvendes:


endlocal & set "myvariable=\%myvariable\%"


Denne linje definerer myvariable i tidligere miljø gendannet med kommando endlocal med den nuværende værdi af myvariable i aktivt miljø ved at analysere denne kommandolinje.


echo/ udsender bare en tom linje på en mere sikker måde end echo. gør.


For at forstå de anvendte kommandoer og hvordan de virker, skal du åbne et kommandopromptvindue, udføre de følgende kommandoer, og læs helt alle hjælpesider, der vises for hver kommando, meget omhyggeligt.



  • echo /?

  • endlocal /?

  • goto /?

  • if /?

  • rem /?

  • set /?

  • setlocal /?



For mere hjælp på, hvad setlocal og endlocal læser dette svar og de to andre svar der refereres der. For en forklaring på brug af set "variable=value" se svaret på hvorfor er der ingen streng output med 'echo\% var\%' efter brug af 'set var=text' på kommandolinjen?

Andre referencer 1


Samme tilgang til citeringsdetektering, der anvendes i Mofi'ets svar (hvis værdien i variablen ikke ændres, når citater fjernes, indeholder variablen ikke citater), kodelogikken er blevet forenklet, og forsinket ekspansion er kun aktiveret, hvis/når < em> nødvendig .


@echo off
    setlocal enableextensions disabledelayedexpansion

:input
    set /p "userInput=? " || (
        echo Error - Empty input not allowed
        goto :input
    )

    setlocal enabledelayedexpansion
    if not !userInput!==!userInput:^"=! set "userInput="
    endlocal & if "\%userInput\%"=="" (
        echo Error - Invalid input - quotes not allowed
        goto :input
    )

    Echo Ok - Successful input


Hvis brugeren ikke indtaster noget, mislykkes kommandoen set /p og fejlen håndteres af || betinget operatør (udfør næste kommando, hvis den foregående fejlede), og anmodede om en ny indgang.


Håndtering af en streng, der kan have specialtegn og ubalancerede citater, kan være problematisk, men forsinket ekspansion giver os mulighed for at bruge værdien i variablerne, efter at nogle af de mere problematiske parserfaser er blevet udført. Så forsinket ekspansion er aktiveret og ved hjælp af en streng substitution operation (erstatte citater med ingenting) vi kontrollerer værdien i variablen mod samme værdi uden citater. Hvis de ikke passer, renser vi variablen.


Derefter er forsinket ekspansion ikke nødvendig og er deaktiveret. Når vi gør det, mister vi den ændring, der er foretaget til variablen, hvis den indeholder citater, men som linjen analyseres, før den udføres, ved hjælp af normal variabel reference (\%var\%) og ikke forsinket ekspansionsreference (!var! ) læsesoperationen erstattes med værdien i variablen, før du begynder at udføre kommandoerne i linjen, så vi kan hente den ændrede værdi. Hvis variablen er tom, indeholder den citater, og vi skal anmode om en ny værdi.