我需要编写一个接受三个参数的bat文件。在这三个参数中,找到最小的一个,然后在屏幕上显示从 1 到 AND 最小参数的所有数字。 我试过了,但不起作用
@ECHO OFF
set /a c=%1
set /a b=%2
set /a a=%3
set Smallest=%d%
if %c% lss %Smallest% set Smallest=%c%
if %b% lss %Smallest% set Smallest=%b%
if %a% lss %Smallest% set Smallest=%a%
Echo Smallest number is %Smallest%
pause>nul
这就是我会做的方式:
@echo off
setlocal
set /A c=%1, b=%2, a=%3
set /A "comp=((a-b)>>31)+1,one=!comp*a+comp*b,comp=((one-c)>>31)+1,Smallest=!comp*one+comp*c"
echo Smallest: %Smallest%
for /L %%i in (1,1,%Smallest%) do echo %%i
也就是说,如果 a > b,则
(a-b)
为正或零(否则为负),并且 (a-b)>>31
为零(否则为 -1,因为 >>
是 31 位的 signed shift) )所以最终如果 a > b则
((a-b)>>31)+1
为 1,或者如果 a < b 则为零。这样我们就用这个值comp
得到b,或者不用这个值!comp!
得到a;并将两者中较小的一个存储在 one
变量中。
同样的方法可以得到
one
和c
中较小的一个。
最后,我们显示从 1 到较小的所有值...
这是本作业的示例代码,如果最小数不小于
1
,则输出最小数以及从 1
到最小数的所有数字。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Smallest=%~1"
if not defined Smallest goto OutputHelp
if "%~2" == "" goto OutputHelp
for %%I in (%*) do if %%~I LSS %Smallest% set "Smallest=%%~I"
echo The smallest number is: %Smallest%
echo(
if %Smallest% GEQ 1 (
for /L %%I in (1,1,%Smallest%) do echo %%I
) else (
for /L %%I in (1,-1,%Smallest%) do echo %%I
)
goto EndBatch
:OutputHelp
echo %~nx0 must be run with at least two integer numbers as arguments.
echo(
echo Example: %~nx0 489 0x2AF 0715
echo(
echo An integer number beginning with 0x is interpreted hexadecimal.
echo An integer number beginning with 0 is interpreted as octal number
echo which cannot contain the digits 8 and 9 to be valid. An invalid
echo octal number is interpreted with value 0.
echo(
echo There is not checked if an argument string is a valid string for
echo a decimal, hexadecimal or octal integer number in the value
echo range -2147483648 to 2147483647 (32 bit signed integer).
:EndBatch
echo(
pause
endlocal
使用示例中的三个数字运行此批处理文件的输出,而不输出从
1
到最小数字的所有数字是:
The smallest number is: 0715
八进制数
0715
是十进制数461
,十六进制数0x2AF
是十进制数687
,这使得八进制数0715
是最小的数。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
call /?
echo /?
endlocal /?
for /?
goto /?
if /?
pause /?
set /?
setlocal /?
我建议还阅读: