BATCH-二进制与for
BATCH- binary with for
我必须制作一个必须计算掩码和网络的脚本,所以我正在尝试使用 for 的脚本,但它无法将 IP 转换为二进制。我认为我没有正确使用变量。
有什么想法吗?
@echo off
setlocal enabledelayedexpansion
set var=%1
set /p var=Introduce la ip:
for /F "tokens=1 delims=." %%a in ("%var%") do (
echo %%a
set "vara=%%a"
:binario
set bin=2
set /a resto=%vara%%%bin%
set /a a=%vara%/%bin%
set resultado=%resto%%resultado%
if %vara% GTR 0 (goto binario)
echo %resultado%
goto siguiente
)
:siguiente
for /F "tokens=2 delims=." %%b in ("%var%") do (
echo %%b
)
for /F "tokens=3 delims=." %%c in ("%var%") do (
echo %%c
)
for /F "tokens=4 delims=." %%d in ("%var%") do (
echo %%d
)
goto fin
:vacio
echo Error!
goto fin
:fin
pause
我发现你有一些小问题。您设置了 var=%1
,但在执行 set /p var=Enter an IP:
之前从未检查是否提供了 %1。你永远不会打电话或转到 :vacio
。正如我在上面评论的那样,批处理脚本中的模数需要写成 %%
以防止评估为可变字符。在 set /a
命令的 var 名称中不需要 %
,并且可以用逗号组合多个 set /a
语句。所以而不是
set /a resto=%vara%%%bin%
set /a a=%vara%/%bin%
(无论如何这是错误的——我会在一分钟内谈到),我建议这会更容易理解和维护:
set /a resto = vara %% bin, numero = vara / bin
最大的问题是您似乎在尝试修改 %%a
。不要那样做。
如果我是你,我会将十进制到二进制的转换移动到一个子程序中,并为每个八位位组调用它。试试这个:
@echo off
setlocal enabledelayedexpansion
set IP=%1
if "%IP%"=="" set /p "IP=Introduce la ip: "
set idx=0
for %%a in (%IP:.= %) do (
if %%a lss 0 goto vacio
if %%a gtr 255 goto vacio
if !idx! gtr 3 goto vacio
set /P "=%%a = "<NUL
call :dec2bin bin[!idx!] %%a
set /a idx += 1
)
echo %bin[0]%.%bin[1]%.%bin[2]%.%bin[3]%
goto fin
:dec2bin <var_para_definir> <numero>
setlocal enabledelayedexpansion
set numero=%~2
set bin=
for /L %%I in (1,1,8) do (
set /a bit = numero %% 2, numero /= 2
set bin=!bit!!bin!
)
echo %bin%
endlocal & set "%~1=%bin%"
goto :EOF
:vacio
echo Error!
goto fin
:fin
pause
有关使用 call
作为 returns 值的函数的更多信息,see this page。
我必须制作一个必须计算掩码和网络的脚本,所以我正在尝试使用 for 的脚本,但它无法将 IP 转换为二进制。我认为我没有正确使用变量。
有什么想法吗?
@echo off
setlocal enabledelayedexpansion
set var=%1
set /p var=Introduce la ip:
for /F "tokens=1 delims=." %%a in ("%var%") do (
echo %%a
set "vara=%%a"
:binario
set bin=2
set /a resto=%vara%%%bin%
set /a a=%vara%/%bin%
set resultado=%resto%%resultado%
if %vara% GTR 0 (goto binario)
echo %resultado%
goto siguiente
)
:siguiente
for /F "tokens=2 delims=." %%b in ("%var%") do (
echo %%b
)
for /F "tokens=3 delims=." %%c in ("%var%") do (
echo %%c
)
for /F "tokens=4 delims=." %%d in ("%var%") do (
echo %%d
)
goto fin
:vacio
echo Error!
goto fin
:fin
pause
我发现你有一些小问题。您设置了 var=%1
,但在执行 set /p var=Enter an IP:
之前从未检查是否提供了 %1。你永远不会打电话或转到 :vacio
。正如我在上面评论的那样,批处理脚本中的模数需要写成 %%
以防止评估为可变字符。在 set /a
命令的 var 名称中不需要 %
,并且可以用逗号组合多个 set /a
语句。所以而不是
set /a resto=%vara%%%bin%
set /a a=%vara%/%bin%
(无论如何这是错误的——我会在一分钟内谈到),我建议这会更容易理解和维护:
set /a resto = vara %% bin, numero = vara / bin
最大的问题是您似乎在尝试修改 %%a
。不要那样做。
如果我是你,我会将十进制到二进制的转换移动到一个子程序中,并为每个八位位组调用它。试试这个:
@echo off
setlocal enabledelayedexpansion
set IP=%1
if "%IP%"=="" set /p "IP=Introduce la ip: "
set idx=0
for %%a in (%IP:.= %) do (
if %%a lss 0 goto vacio
if %%a gtr 255 goto vacio
if !idx! gtr 3 goto vacio
set /P "=%%a = "<NUL
call :dec2bin bin[!idx!] %%a
set /a idx += 1
)
echo %bin[0]%.%bin[1]%.%bin[2]%.%bin[3]%
goto fin
:dec2bin <var_para_definir> <numero>
setlocal enabledelayedexpansion
set numero=%~2
set bin=
for /L %%I in (1,1,8) do (
set /a bit = numero %% 2, numero /= 2
set bin=!bit!!bin!
)
echo %bin%
endlocal & set "%~1=%bin%"
goto :EOF
:vacio
echo Error!
goto fin
:fin
pause
有关使用 call
作为 returns 值的函数的更多信息,see this page。