前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >运维必学 | 运算符优先级-从零开始学Windows批处理(Batch)编程系列教程

运维必学 | 运算符优先级-从零开始学Windows批处理(Batch)编程系列教程

作者头像
全栈工程师修炼指南
发布2023-10-31 17:14:00
2220
发布2023-10-31 17:14:00
举报

本文为作者原创文章,为尊重作者劳动成果禁止非授权转载,若需转载请在【全栈工程师修炼指南】公众号留言,或者发送邮件到 [master@weiyigeek.top] 中我将及时回复

0x00 批处理(Batch)中特殊符号

描述: 在Windows的DOS命令或者Batch批处理中提供了许多的特殊符号,给脚本开发提供了许多遍历,下面我们就来看看批处理中特殊符号。

1.标准重定向 " > " 与 " >> "

描述: 主要将输出信息重定向到指定的设备或文件,系统默认输出到显示器。

使用示例: " > " :如果文件a.txt本来已经存在,该命令将首先擦除a.txt中的所有信息,然后写入信息 weiyigeek ;若a.txt本来就不存在,该命令即可新建一个a.txt文件,并写入信息 weiyigeek .

" >> ":则是向原文件中末尾继续追加字符串或者值,不会覆盖已有数据。

代码语言:javascript
复制
@echo off
echo weiyigeek > a.txt
echo weiyigeek.top > a.txt
:: 输出数字到 a.txt 文件中
echo 1024 > a.txt
:: 显示 a.txt 文件中的数据
type a.txt
pause

温馨提示: 因为数字的特殊性,在echo输出数字时请在后面加上空格。

2." < "标定输入重定向

描述: 将输入信息来源重定向为指定的设备或文件,系统默认从显示器读取输入信息。

代码语言:javascript
复制
@echo off
echo 请任意输入字符以回车结束
set /p ifo=
echo "欢迎关注【全栈工程师修炼指南】公众号,作者 WeiyiGeeker" > a.txt
echo 【从屏幕获得的输入信息 】
echo %ifo% 
:: 将a.txt文件重定向输入到ifo变量中
set /p ifo=<a.txt    
echo 【 从文件a.txt获得的输入信息 】    
:: 输出从文件中读取的字符串
echo %ifo% 
pause

观察命令与输出即可体会到重定向的功能和效果

3." | " 管道符号

描述: |是一个管道传输命令,意思是将上一命令执行的结果传递给下一命令去处理。

此命令前加上 echo y 并用管道传输符|将echo执行的结果y传递给choice命令,从而达到手工输入Y的效果.

代码语言:javascript
复制
@echo off
echo y|choice /C yn /M "看友,你是否关注了【全栈工程师修炼指南】公众号!"

4." ^ "转义符号

描述: ^是对特殊符号 > 、<、 &的前导字符, 在命令中它可以将以上的3个符号的特殊动能去掉,仅仅只吧他们当成符号输出而不使用他们的特殊意义。

代码语言:javascript
复制
# 示例1.转义特殊字符串
@echo off
echo ^|
echo ^&^&
echo ^<
echo ^<<

# 示例2.从下面结果可以看出并没有把test写入文件1.txt而是将test >1.txt 当字符串显示了出来, 此符号在远程构建批处理的时候很有效果。
echo test ^> 1.txt
  # test > 1.txt

# 示例3.使用%字符改变特殊字符属性,此处使用%去掉%字符的调用变量属性,即输出%%1。
echo %%1 = %1

偷偷的告诉你哟?极客全栈修炼】微信小程序已开放

可直接在微信里面直接浏览博主文章哟,后续将上线更多有趣的小工具。


0x01 批处理(Batch)中逻辑命令符

描述: 批处理中逻辑命令符包括"&" / "&&" / "||", 其解释如下:

  • " & " : 它的作用是用来连接n个DOS命令,并把这些命令按顺序执行,而不管是否有命令执行失败;
  • " && " : 当前面的命令成功执行时,执行&&;后面的命令,否则不执行;
  • " || " : 当前面的命令失败时,执行||后面的命令,否则不执行。
代码语言:javascript
复制
# 示例1.依次执行命令
whoami & dir /b & net user

# 示例2.此处没有正确执行 time /t 由于前面得命令没正确执行
date /t && @who && time /t  

# 示例3.要么第一个执行后面都不执行,要么前面都没正确执行,后面才执行
date /t || who || time /t
w || who || time /t

综合示例:

代码语言:javascript
复制
@echo off
echo ^&
reg delete HKCU /v try /f & echo **也许成功**
reg delete HKCU /v try /f & echo **也许失败**

echo ^&^&
reg delete HKCU /v try /f && echo **成功**
reg delete HKCU /v try /f && echo **失败**

echo ^|^|
reg add HKCU /v try /f || echo **失败**
reg add HKCU1 /v try /f || echo **成功**
pause

0x02 批处理(Batch)中运算符及优先级

描述: 在Windows批处理脚本中,主要是使用 set 命令 (set /a expression) 来进行运算,批处理中的变量是不区分类型的,不需要像C语言中的变量那样还要区分int、float、char等,例如 a=234 也可以是int,也可以说char。

在介绍批处理运算符之前,我们先来看看有哪些运算符以及其优先级层次, 下述优先权逐步递减:

代码语言:javascript
复制
() : 分组
! ~ - : 一元运算符
* / % : 算数运算符
+ - : 算数运算符
<< >> : “逻辑移位”           #双引号
& : 按位“与”逻辑             #双引号
^ : 按位“异”逻辑             #双引号
| : 按位“或”逻辑             #双引号
= *= /= %= += -= : “赋值”  
&= ^= |= <<= >>=            # 双引号
, :“表达式分隔符”

温馨提示: 对于"逻辑或取余操作符", 我们需要把他们用双引号引起来, 否则会报错!

1.分组运算符

描述: () 其优先级最高。

代码语言:javascript
复制
C:\Users\WeiyiGeek>set /a tt=2*(1+3)
8

2.一元运算符

示例演示

代码语言:javascript
复制
set /a tt=!0     // 取反 [ 1, 0]
set /a tt=~0     // -1 + ( -n ) ,假如 ~1 则为 -2 
set /a tt=-1     // 表示负号

3.逻辑位移符

示例演示

代码语言:javascript
复制
# 左移 -> 2^n , 后面的数值就表示2的几次方
set /a tt=3"<<"2    # 3*(2**2) = 12
set /a tt=3"<<"3    # 3*(2**3) = 24

# 右移 -> 1/(2^n) 
>set /a tt=15">>"2       # 注意其数值不会四舍五入会取整。15/(2**2) = 15/4 = 3.75 = 3
>set /a tt=12">>"2       # 12/(2**2) = 3 
>set /a tt=8">>"2        # 8/4 = 2

4.逻辑运算符

示例演示:

代码语言:javascript
复制
# 与 & 一假必假
set /a tt = 1 "&" 0   # 0
set /a tt = 1 "&" 1   # 1

# 或 | 一真必真
set /a tt = 1 "|" 0   # 1
set /a tt = 0 "|" 0   # 0
set /a tt = 0 "|" 1   # 1

# 异或 ^, 相同则假 False, 不同则真 True
set /a tt =1"^"1      # 0
set /a tt =1"^"0      # 1 
set /a tt =0"^"0      # 0

5.赋值、算数运算符

示例演示:

代码语言:javascript
复制
# 示例1,注意=后操作数之间无空格
set a=1         # a=1
set /a a*=2       # a=a*2 = 2
set /a a*=3       # a=a*3 = 6
set /a a-=3       # a=a-3 = 3
set /a a+=3       # a=a+3 = 6
set /a a/=3       # a=a/3 = 2
set /a a%=2       # a=a%2 = 0

# 示例2
set a=1 
set /a a&=1
  # 6'1' 不是内部或外部命令,也不是可运行的程序,注意,不加双引号得时候会报错
set /a a"&=1    # 1
set /a a"&="1   # 1
set /a a"&="2   # 2
set /a a"&="0   # 0

# 示例3
set a=0       
set /a a"&="2   # 0
set /a a"|="2   # 2
set /a a"|="0   # 0
set /a a"^="0   # 0
set /a a"^="2   # 2

# 示例4
set a=2 
set /a a"<<="4   #  1 * (2**4) = 16

# 示例5,可以运算多个variable的值,用“,”分割符号分割
set /a a=1+1, b=2*3, tt+=1
1
echo %a% , %b% , %tt%
2 , 6 , 1

本文至此完毕,更多技术文章,尽情等待下篇好文!

原文地址: https://blog.weiyigeek.top/2023/6-25-753.html

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈工程师修炼指南 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.标准重定向 " > " 与 " >> "
  • 2." < "标定输入重定向
  • 3." | " 管道符号
  • 4." ^ "转义符号
  • 1.分组运算符
  • 2.一元运算符
  • 4.逻辑运算符
  • 5.赋值、算数运算符
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档