Fork me on GitHub

set 续3

-------siwuxie095

   

   

   

   

set 技巧高级篇:

   

1、利用 set /a 进行赋值

   

在开启变量延迟情况下,要判断数组 S!n! 的值的情况,

不可以这么写:

if !S!n!!==0 echo zero

   

也不可以这么写:

if S!n!==0 echo zero

   

可以利用 set /a等号右边表达式变量不必添加变量符号的规则

来实现赋值,赋值后即可进行判断

set /a var=S!n!

if !var!==0 echo zero

   

这里,如果不是用 set /a,而仅仅 set var=S!n!,得到的 var 仅仅

是数组名,同样行不通

   

当多个变量需要赋统一个值时,也可以用 set /a 来达到简化代码的目

的:

@echo off

set /a A=B=C=D=1

echo %A% %B% %C% %D%

pause

   

sublime中:

   

   

   

有多个计算式,同样也可以用 set /a 来简化代码:

@echo off

set /a A=1,B=2,C=3,D=4

set /a A+=1,B+=2,C+=3,D+=4

echo %A% %B% %C% %D%

pause

   

sublime中:

   

   

   

   

   

2、利用 set /p var=%num%<nul 输出数据

   

如果输出大量的数据,用 echo 命令,每行只输出一个数据,这样

会浪费大量的显示界面,不符合习惯。将大量数据在同一行输出必

须用 set 命令。

   

set /p var=%num%<nul,可以实现对数字连续输出的效果

如:

@echo off

for /l %%i in (1,1,10) do set /p var=%%i<nul

pause

   

sublime中:

   

   

运行一览:

   

   

   

上面的全部数据都揉成一团,不符合习惯,

可以增加空格隔开数据:

@echo off

for /l %%i in (1,1,10) do set /p var=%%i <nul

pause

   

sublime中:

   

   

运行一览:

   

   

   

   

数字与数字之间是隔开,但是,如果输出的数字位数不一样,

而间隔都相同,就会造成下面一种可能的结果:

1 2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19

即,上下没有对齐,依然不符合书写和阅读习惯

   

   

实现上下对齐,要借助输出格式:%var:~m,n%

   

具体实现:先对每个数字前面增加若干空格,然后用

%var:~m,n% 末尾 k 位输出即可。另外,外加一个计

数器,每输出 i 位数后换行。

格式:

set var= %str%

set /p print=%var:~-k%<nul

   

:: %str% 前面加了若干空格

set var= %str%

set /p print=%var:~-k%<nul

   

sublime中:

   

   

   

   

如:

@echo off

setlocal enabledelayedexpansion

for /l %%i in (11,1,100) do (

rem 下面的 = %%i 之间隔了那么多空格

rem 是为了后面的!var:~-7!的输出格式做准备

rem 意为取 var 后面7个字符

set var= %%i

set /p print=!var:~-7! <nul

set /a num=%%i%%10

if !num!==0 echo.

)

pause

   

   

sublime中:

   

   

运行一览:

   

   

   

   

   

set /p print=%num%<nul 中的 print 并不是必须的,

可以省略为 set /p =%num%<nul,不过这样写不太规

范,不建议这么写。

   

   

再如:

读入两个数据,输入两个数据之间的所有数。要求:每输出

10 个数据后换行,并且上下数字要靠右对齐

   

goto 实现:

@echo off

setlocal enabledelayedexpansion

set /p a=请输入起始数字

set /p b=请输入最终数字

set num=1

:begin

if !a! leq !b! (

rem 注意下面 var !a! 之间有若干空格

set var= !a!

rem 注意下面 ! <nul 之间有一个空格

set /p v=!var:~-5! <nul

set /a a+=1

set /a num+=1

if !num! == 11 (

echo.

set num=1

)

goto begin

)

echo.&pause

   

sublime中:

   

   

运行一览:

   

   

   

   

for 实现:

@echo off

setlocal enabledelayedexpansion

set /p a=请输入起始数字

set /p b=请输入最终数字

set num=0

for /l %%i in (%a%,1,%b%) do (

set var= !a!

set /p v=!var:~-5! <nul

set /a a+=1

set /a num+=1

set /a tem=!num!%%10

if !tem!==0 echo.

)

echo.&pause

   

sublime中:

   

   

   

小结:

<nul0<nul 的简写,0 句柄是默认的输入句柄,nul空设备

所以 <nul 表示从空设备获取输入

   

set /p 执行时会等待用户的输入,<nul 使得 set /p 输入设备为空

(默认情况下为 0<con,也就是键盘输入 )此时 set /p 就会自动

终止输入,此处的 <nul 和手动按回车效果一样,只是它不需要人工

操作。也就是:

set /p=提示语句<nul

等同于:

set /p=提示语句【按回车】

   

利用这个特性,再加上 set /p 内置的不换行显示提示语句的功能,

就能够实现不换行显示,不过它有一个缺陷,就是无法显示以等号开

头的行(而且 win7 下会把开头连续的空格与制表符忽略)

   

   

   

【made by siwuxie095】

   

   

   

   

   

   

   

posted on 2017-02-05 23:01  siwuxie095  阅读(298)  评论(0编辑  收藏  举报

导航