前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >windows 批处理命令必知必会

windows 批处理命令必知必会

作者头像
郑小超.
发布2021-02-01 11:28:57
4690
发布2021-02-01 11:28:57
举报
文章被收录于专栏:GreenLeavesGreenLeaves

全局用例,有如下txt文件,内容如下:

代码语言:javascript
复制
1、java.jar 
2、.net.dll
3、javascript.js
4、image.jpeg 
5、html.htm

1、for命令

(1)、参数 /f 代表扫描文件,打印文件所有内容,代码如下:

代码语言:javascript
复制
for /f %%i in (C:\Users\Administrator\Desktop\test.txt) do echo %%i 
pause>nul 

如果不加/f参数,输入如下:

直接输出了文件名

(2)、delims参数 按指定的字符串切分,默认情况下,只显示第一个分隔符前的内容.如下代码

代码语言:javascript
复制
@echo off
for /f "delims=、" %%i in (C:\Users\Administrator\Desktop\test.txt) do echo %%i
pause>nul 

按顿号分割,每一行

注意文件的编码,因为、中文中才有.根据内容发现,其只显示了分隔符之前的内容.

(3)、tokens参数,(2)中实例的缺点很明显.通过delims分割后,默认只取分割后第一个内容,如果我要取、后面的内容怎么取?所以tokens参数就是用来解决这个问题的.如下代码:

代码语言:javascript
复制
for /f  "tokens=2 delims=、" %%i in (C:\Users\Administrator\Desktop\test.txt) do echo %%i
pause>nul 

(4)、tokens参数配合delims参数,delims参数按多个字符分割,然后取一列.

代码语言:javascript
复制
@echo off
for /f  "tokens=2 delims=、." %%i in (C:\Users\Administrator\Desktop\test.txt) do echo %%i
pause>nul 

(4)、通过tokens提取多列,上面的例子都是提取一列的,假设需要提取序号和后缀,代码如下:

代码语言:javascript
复制
@echo off
for /f "tokens=1,3 delims=、-." %%i in (C:\Users\Administrator\Desktop\test.txt) do echo %%i %%j
pause>nul 

关于更多for命令参考 https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/for

2、@echo off命令

关闭所有命令(包括本身这条命令)的回显,1.1中的代码显然不是想要的,因为每echo一次,都会回显一次,关于回显ms给出了解释,大致就是每一行echo都会在命令行中执行一下,但显然不是我想要的,我要在一块的输出,所以@echo off命令用上了.代码如下:

代码语言:javascript
复制
@echo off
for /f %%i in (C:\Users\Administrator\Desktop\test.txt) do echo %%i 
pause>nul 

输出了文本的所有信息,没有任何多余的执行信息.

注:如果不带,如下:

代码语言:javascript
复制
echo off
for /f %%i in (C:\Users\Administrator\Desktop\test.txt) do echo %%i 
pause>nul 

关于更多echo 参考https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/echo

3、setlocal enabledelayedexpansion延迟环境变量扩展

windows批处理命令对变量的处理,采用替换的方式,且其是一句一句(必须是一条完整的语句)执行的.如果不明白,看如下例子.

(1)、定义一个变量,并输出:

显然,cmd将上面的操作分为两条语句.所以输出正常.下面换种写法

按常规思路输出应为1,但是错了,所以windows批处理命令对变量的处理,采用替换的方式,且其是一句一句(必须是一条完整的语句)执行的这句话看起来是对的.因为cmd将其看作了一条语句,大家一起执行(猜的),那么输出var的时候set var=1还没有执行,所以没有输出.

如何实现常规思路的结果呢?通过setlocal enabledelayedexpansion,通过延时的方式,将这条语句拆分,一个个执行(猜的),如下:

代码语言:javascript
复制
@echo off & setlocal enabledelayedexpansion
set var=1 & echo !var!
pause

(2)、从(1)中找出了cmd这个特性,那么所有带()的命令都会有如此特性,如for if等

(3)、正因为cmd的如此特性,对应echo 变量的方式也需要变换,不能使用%%,而是要使用!!来标记变量.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-01-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档