Отображение одного выхода на основе диапазона номеров (если, перейти) - PullRequest
0 голосов
/ 31 мая 2018

Может кто-нибудь объяснить мне, почему это не будет отображать только результат для числа в диапазоне, указанном в команде if?Независимо от того, что я пробовал, он постоянно отображает все результаты, несмотря на указанный диапазон.Я уже посмотрел этот ответ , но он не работает.Например, если я напишу if %ans% LEQ 8 GOTO :2, он отобразит все результаты для всех чисел, меньших 8, а не только от 5 до 8 (что я и пытаюсь отобразить).

set num1=%1
set num2=%2
set /a ans=num1+num2

if %ans% LEQ 4 GOTO :1

if %ans% GTR 4 if %ans% LEQ 8 GOTO :2

if %ans% GTR 8 if %ans% LEQ 16 GOTO :3

if %ans% GRT 16 if %ans% LEQ 32 GOTO :4

:1
echo # Host Req     #   Mask   #       Netmask      #   Max Supported #
echo   %ans%            /30            255.255.255.252      4
echo.

:2
echo # Host Req     #   Mask   #       Netmask      #   Max Supported #
echo   %ans%            /29            255.255.255.248      8
echo.

:3
echo # Host Req     #   Mask   #       Netmask      #   Max Supported #
echo   %ans%            /28            255.255.255.240      16
echo.

:4
echo # Host Req     #   Mask   #       Netmask      #   Max Supported #
echo   %ans%            /27            255.255.255.224      32
echo.

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Согласно CIDR-блокам IPv4 Ваши max supported значения неверны:

При обычном использовании первый адрес в подсети, все двоичные нули в идентификаторе хоста,зарезервирован для обращения к самой сети, в то время как последний адрес, весь двоичный адрес в идентификаторе хоста, используется в качестве широковещательного адреса для сети;это уменьшает количество адресов, доступных для хостов, на 2.

Пакетный режим способен выполнять битовую маску и операции сдвига для вычисления требуемых значений и, таким образом, устраняет необходимость в разных таблицах.

:: Q:\Test\2018\05\31\SO_50615266.cmd
@Echo off&SetLocal EnableExtensions EnableDelayedExpansion

set num1=%1
set num2=%2
set /a ans=num1+num2

for /l %%L in (2,1,8) do (
    set /a "Max=(1<<%%L)-2, Mask=32-%%L, OC4=254-Max"
    If !Max! geq %ans% (
        echo(## Calculated on %computername% by %username% at %date% %time:~0,8%
        echo # Host Req     #   Mask   #       Netmask      #   Max Supported #
        echo   %ans%            /!Mask!            255.255.255.!OC4!      !Max!
        echo(
        Goto :Eof
    )
)
Echo %ans% exceeds a class D net

Образец вывода:

> Q:\Test\2018\05\31\SO_50615266.cmd 1 1
## Calculated on HP-G1610 by LotPings at 2018-05-31 18:37:06,77
# Host Req     #   Mask   #       Netmask      #   Max Supported #
  2            /30            255.255.255.252      2


> Q:\Test\2018\05\31\SO_50615266.cmd 14
## Calculated on HP-G1610 by LotPings at 2018-05-31 18:37:38
# Host Req     #   Mask   #       Netmask      #   Max Supported #
  14            /28            255.255.255.240      14
0 голосов
/ 31 мая 2018

Вот как бы я это сделал:

@echo off

set /a ans=%1+%2

for %%n in (4 8 16 32) do if %ans% LEQ %%n GOTO :%%n

echo %ans% is greater than 32
goto :EOF

:4
echo # Host Req     #   Mask   #       Netmask      #   Max Supported #
echo   %ans%            /30            255.255.255.252      4
echo.
goto :EOF

:8
echo # Host Req     #   Mask   #       Netmask      #   Max Supported #
echo   %ans%            /29            255.255.255.248      8
echo.
goto :EOF

:16
echo # Host Req     #   Mask   #       Netmask      #   Max Supported #
echo   %ans%            /28            255.255.255.240      16
echo.
goto :EOF

:32
echo # Host Req     #   Mask   #       Netmask      #   Max Supported #
echo   %ans%            /27            255.255.255.224      32
echo.
goto :EOF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...