windows - Script ignorerer exit kommandoen og bryder ud af funktionen BATCH/CMD

Indlæg af Hanne Mølgaard Plasc

Problem



Dette script, jeg skrev, skulle parse og trække IP-information ud af WMIC. Problemet er, når det bruges på en computer, hvor kun 1 DNS-server er indtastet, går scriptet mislykket. Det ser ud til at køre: fjernfunktionen, selvom den variable DNS2 ikke er indstillet, og så fjernes funktionen på en eller anden måde, jeg er ikke bekendt med og ignorerer exitkommandoen og bryder ud af funktionen og ind i dele af scriptet, jeg don 't vil have det i. Her er den fornærmende kode, test den ved at indstille dine DNS-servere og indeks. Script fungerer med 2 DNS-servere defineret og gør ikke t med kun 1.


@echo off
setlocal enabledelayedexpansion
SETLOCAL ENABLEEXTENSIONS
wmic NICCONFIG where "Index = 1" get /Value | more > storage.txt

for /f "tokens=1-9 delims=,}{=" \%\%f in (storage.txt) do (
    set cat=\%\%f
    IF /i !cat!==IPAddress (set IP=\%\%g)
    IF /i !cat!==IPSubnet (set SUB=\%\%g)
    IF /i !cat!==DefaultIPGateway (set GW=\%\%g)
    IF /i !cat!==DNSServerSearchOrder (
        set DNS=\%\%g
        set DNS2=\%\%h
    )
    IF /i !cat!==IPEnabled (set enabled=\%\%g)
    IF /i !cat!==Description (set desc=\%\%g)
)
if /i \%enabled\%==True (
if defined IP (
    set item=IP
    CALL :remove
        )
if defined SUB (
    set item=SUB
    CALL :remove
        )
if defined GW (
    set item=GW
    CALL :remove
        )
if defined DNS (
    set item=DNS
    CALL :remove
        )
if defined DNS2 (
    set item=DNS2
    CALL :remove
        )
)
goto :menu
echo SHOULDN'T BE HERE
pause
:::::::::Function to remove quotes::::::::::::::
:remove
for /f tokens^=1^ delims^=^" \%\%p in (!\%item\%!) do (
    set !item!=\%\%p
    rem echo !\%item\%!
    EXIT /b
    )
echo I BROKE OUT OF THE FUNCTION
pause
:menu
echo I worked!
echo \%IP\%
echo \%SUB\%
echo \%GW\%
echo \%DNS1\%
if defined DNS2 ( echo \%DNS2\% )
pause


Her er et andet eksempel ved at bruge LotPings omarbejde, bemærk at selvom der ikke er en DNS2, udfører den stadig bunden 'hvis defineret'


@echo off
SETLOCAL ENABLEEXTENSIONS enabledelayedexpansion
Set Prop=IPAddress IPSubnet DefaultIPGateway DNSServerSearchOrder IPEnabled Description
for /f "tokens=1-9 delims=,}{=" \%\%f in (
  'wmic NICCONFIG where "Index = 1" get /Value^|findstr /i /B "\%Prop\%"'
) do (IF /i \%\%f==IPAddress set "IP=\%\%~g"
      IF /i \%\%f==IPSubnet  set "SUB=\%\%~g"
      IF /i \%\%f==DefaultIPGateway  set "GW=\%\%~g"
      IF /i \%\%f==DNSServerSearchOrder (
        set "DNS=\%\%~g"
        set "DNS2=\%\%~h"
      )
      IF /i \%\%f==IPEnabled   set "enabled=\%\%~g"
      IF /i \%\%f==Description set "desc=\%\%~g"
)
set|Findstr /i /B "IP SUB GW DNS Ena Desc"
echo I worked!
echo \%DNS\%
echo \%DNS2\%
if defined DNS2 ( echo DNS2 found, shouldn't have found this)
pause

Bedste reference


REDIGER Komplet omarbejdning af partiet uden midlertidig fil:


@echo off
SETLOCAL ENABLEEXTENSIONS enabledelayedexpansion
Set Prop=IPAddress IPSubnet DefaultIPGateway DNSServerSearchOrder IPEnabled Description
for /f "tokens=1-9 delims=,}{=" \%\%f in (
  'wmic NICCONFIG where "Index = 1" get /Value^|findstr /i /B "\%Prop\%"'
) do (IF /i \%\%f==IPAddress set "IP=\%\%~g"
      IF /i \%\%f==IPSubnet  set "SUB=\%\%~g"
      IF /i \%\%f==DefaultIPGateway  set "GW=\%\%~g"
      IF /i \%\%f==DNSServerSearchOrder (
        set "DNS=\%\%~g"
        set "DNS2=\%\%~h"
      )
      IF /i \%\%f==IPEnabled   set "enabled=\%\%~g"
      IF /i \%\%f==Description set "desc=\%\%~g"
)
If "\%DNS2:~3\%" EQU "" Set "DNS2="
set|Findstr /i /B "IP SUB GW DNS Ena Desc"
echo I worked!
pause

Andre referencer 1


Når du har sådanne problemer, skal du tilføje fejlfindingsoplysninger på relevante punkter.

Tilføj i dine tilfælde nogle ekko s


IF /i \%\%f==DNSServerSearchOrder (
        set "DNS=\%\%~g"
        set "DNS2=\%\%~h"
        echo #1 "\%\%~g"
        echo #2 "\%\%~h"
        if defined dns echo DNS defined
        if defined dns2 echo DNS2 defined
      )


Jeg får noget som dette


> #1 "10.51.16.9"
> "2 "
> DNS defined
> DNS2 defined


Som du kan se, er DNS2 defineret, og echo #2 "\%\%~h" viser en ødelagt linje!

Årsagen er her, at wmic-linjens slutninger er i stedet for .

Derfor er i DNS2 nu et enkelt tegn.


Du kan bruge en sanitize-funktion til at fjerne alle fra variabler.

Dette fungerer, da alle fjernes efter en variabel udvidet med procent tegn (men ikke når det udvides med udråbstegn eller hvis det er en \%\%p parameter)


:sanitize
set "var=!\%1!"
set "\%1=\%var\%"
exit /b


Og brug det ved


IF /i \%\%f==DNSServerSearchOrder (
        set "DNS=\%\%~g"
        set "DNS2=\%\%~h"
        call :sanitize DNS
        call :sanitize DNS2
        echo #1 "!DNS!"
        echo #2 "!DNS2!"
        if defined dns echo DNS defined
        if defined dns2 echo DNS2 defined
      )


Det er alt ...

Andre referencer 2




Indpak en anden for /F loop rundt den, der analyserer wmic output:


rem // Code before the loop
for /F "delims=" \%\%e in ('
    wmic NICCONFIG where "Index = 1" get /Value ^| findstr /I /B "\%Prop\%"
') do (
    for /F "tokens=1-9 delims=,}{=" \%\%f in ("\%\%e") do (
        rem // Code inside of the loop...
    )
)
rem // Code after the loop...


Kommandoen wmic producerede Unicode-output, som ikke korrekt konverteres til ANSI-tekst via for /F -sløjfen, der er nogle forældreløse vognretur tegn tilbage, som forstyrrer parsningen. Den ekstra for /F løkke fjerner disse genstande på en generel og pålidelig måde.