【批处理DOS-CMD命令-汇总和小结】-批处理命令中的参数%0、%1、%2、%[0-9]、%0-9和批处理命令参数位置切换命令shift,dos命令中操作符%用法
一、执行CMD命令的3种方式
执行CMD命令的两种方式分别是手动创建一个Cmd窗口和执行bat批处理文件。
第一种,先手动创建一个cmd窗口,然后往里面输入cmd命令,最后回车执行。
第二种,先在一个bat文件中键入cmd命令,保存代码后,双击执行。
第三种,先在一个bat文件中键入cmd命令,保存代码后,在手动创建的cmd窗口中用命令执行bat文件。
二、批处理命令中的参数——%0、%1、...、%9、%*
何谓批处理命令中的参数?
在手动创建的Cmd窗口中直接执行命令是没有参数可言的,只有在手动创建的cmd窗口中执行bat批处理文件才有参数。
因为%0-%9都是形式参数,如果没有赋值,就是普通字符串,所以下面在手动创建的cmd窗口中echo出来的都是原文本。如果把%0-%9比作10个指针,当没有指向一个数值时,就是普通字符串。
往bat文件中输入参数的格式如下:bat_filepath arg1 arg2 ... argx(bat_filepath表示第0个参数,对应%0,arg1表示第x个参数,对应%1,以此类推,参数与参数之间用空格或制表符分隔)。
假设 【d:\D-desktop】中有3个bat文件——main.bat、main1.bat、demo.bat。
demo.bat文件中的代码如下:
chcp 65001
@echo off
echo %0
echo %~0
echo %~f0
echo %1
echo %2
pause
在当前目录为【d:\D-desktop】的情况下,执行命令【demo main.bat main1.bat】。
结果如下,我们可以看到五行输出中,demo对应%0,于是echo %0的输出是demo,而main.bat对应%1、main1.bat对应%2,于是echo %1和echo %2的输出是main.bat和main1.bat。
至于第2行的echo %~0和第3行的echo %~f0,涉及到参数扩展的知识,我们在第五章详细铺开。
那什么是%*呢?
%*代表全部的批处理参数,也即代表%1-%9整体,不同参数之间用空格分隔。
在main.bat文件中添加下面的代码,在cmd命令窗口执行命令【main.bat 123 456】。
@echo off
chcp 65001
echo %0
echo %1
echo %2
echo %*
pause
输出结果如下。
在bat脚本中直接执行【%0】或通过call命令调用%0,都会导致Bat文件陷入没有尽头的死循环。
@echo off
chcp 65001
echo "大哥出生了"&echo "二弟出生啦"&echo "三妹出生啦"
(
echo "大哥出生了"
echo "二弟出生啦"
echo "三妹出生啦"
)
call %0
pause
你们可以把上面这块代码复制到bat文件中,双击执行试试,绝对会不断地“生孩子”哈哈哈。
三、批处理参数和3种执行方式
在本文第一章提到对cmd命令的3种执行方式(小生不才,可能还有更多种执行方式哈哈哈,但是本文只讨论这3种)。
第一种属于非批处理脚本执行方式,没有参数可言。
第二种和第三种属于批处理脚本执行方式。
第二种无法手动输入参数,但是有参数的意义,一般来说只有%0这一个参数,默认就是bat文件的完整路径。
但是,有些BAT文件中如果执行call命令的时候,不管是内部调用还是外部调用,只要后面加了参数,就至少给指针%1赋予了数据。
举个例子。
main.bat的代码(type %1下面还有一个空行,不然最后执行时第2个echo=的空行效果会被抑制)如下所示:
@echo off
echo %0
echo %~f0
echo=
call :end D:\D-desktop\demo.bat
pause
:end
type %~f0
echo=
type %1
demo.bat的代码(echo %2下面还有一个空行,不然最后type完了,主程序的pause提示信息会接在echo %2上)如下所示:
chcp 65001
@echo off
echo %0
echo %~0
echo %~f0
echo %1
echo %2
双击执行main.bat文件,结果如下所示:
我们可以发现demo.bat文件的路径参数被传至了主程序的%1中,也由此可见call命令进行内部调用时,批处理参数从%1开始计量。
第三种可以手动输入参数,与第二种执行方式不同的是%0这个参数根据执行bat文件时所用命令的输入形式有关,其中第1个输入值直接原本不动地转化为%0,可能会覆盖默认的完整路径。
举个例子,demo.bat文件在路径【D:\D-desktop】中。假设执行cmd命令【demo.bat】,那么%0就等于【demo.bat】。而如果是直接双击(也可以是其他非cmd命令执行方式),那么%0就是等于【D:\D-desktop\demo.bat】。
四、批处理参数和shift命令
第二章我们知道形式参数一共有10个,分别是%0、%1、...、%9,但是实际我们可能会需要输入大于10的参数数量,如何实现呢?
这就要提到本章节的主人翁——shift命令。
4.1 打印shift命令的帮助信息
执行【shift /?】。
一句话,shift命令专门用来偏移批处理参数和输入参数值之间的对应关系。
帮助文档对shift命令的简述是“更改批处理文件中可替换参数的位置” ,显然没有我的总结更加准确直观。
而shift命令的唯一参数就是/n,n指的是起始偏移位置。例如n=2时,只有%x(x>=2)的指针才需要偏移。
4.2 shift命令作用机制的直观呈现
4.2.1 不带参数的shift命令——shift
假设初始状态下(如下引用块所示),cmd为bat脚本文件名,可以用%0引用。
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
| | | | | | | | | | |%0 %1 %2 %3 %4 %5 %6 %7 %8 %9
经过1次shift后,cmd将无法被引用,因为没有一个指针指向它。
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
| | | | | | | | | |
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9
经过2次shift后,arg1也被废弃,%9指向为空,也没有意义。
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
| | | | | | | | |
%0 %1 %2 %3 %4 %5 %6 %7 %8
4.2.2 带参数n的shift命令——shift /n
假设初始状态下(如下引用块所示),cmd为bat脚本文件名,可以用%0引用。
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
| | | | | | | | | | |%0 %1 %2 %3 %4 %5 %6 %7 %8 %9
执行一次shift /2,因为起始偏移位置设置成2,因此%0和%1都原地待命,%2-%9才需要向右偏移。这时候,arg2参数值成为了没有指针指向的对象。
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
| | | | | | | | | | |%0 %1 %2 %3 %4 %5 %6 %7 %8 %9
再执行一次shift /2,arg2和arg3全没指针引用,%9指针也没有指向一个参数值。
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
| | | | | | | | | | |%0 %1 %2 %3 %4 %5 %6 %7 %8
五、参数(指针)的扩展形式
很有意思的一点,批处理参数的扩展帮助文本,竟然是靠执行【call /?】获得的,call命令和批处理参数关系真不一般。
5.1 获得call命令的帮助信息——call /?
d:\D-desktop>call /?
从批处理程序调用另一个批处理程序。CALL [drive:][path]filename [batch-parameters]batch-parameters 指定批处理程序所需的命令行信息。如果命令扩展被启用,CALL 会如下改变:CALL 命令现在将卷标当作 CALL 的目标接受。语法是:CALL:label arguments一个新的批文件上下文由指定的参数所创建,控制在卷标被指定
后传递到语句。你必须通过达到批脚本文件末两次来 "exit" 两次。
第一次读到文件末时,控制会回到 CALL 语句的紧后面。第二次
会退出批脚本。键入 GOTO /?,参看 GOTO :EOF 扩展的描述,
此描述允许你从一个批脚本返回。另外,批脚本文本参数参照(%0、%1、等等)已如下改变:批脚本里的 %* 指出所有的参数(如 %1 %2 %3 %4 %5 ...)批参数(%n)的替代已被增强。你可以使用以下语法:%~1 - 删除引号("),扩展 %1%~f1 - 将 %1 扩展到一个完全合格的路径名%~d1 - 仅将 %1 扩展到一个驱动器号%~p1 - 仅将 %1 扩展到一个路径%~n1 - 仅将 %1 扩展到一个文件名%~x1 - 仅将 %1 扩展到一个文件扩展名%~s1 - 扩展的路径只含有短名%~a1 - 将 %1 扩展到文件属性%~t1 - 将 %1 扩展到文件的日期/时间%~z1 - 将 %1 扩展到文件的大小%~$PATH:1 - 查找列在 PATH 环境变量的目录,并将 %1扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此修改符会扩展到空字符串可以组合修改符来取得多重结果:%~dp1 - 只将 %1 扩展到驱动器号和路径%~nx1 - 只将 %1 扩展到文件名和扩展名%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,并扩展到找到的第一个文件的驱动器号和路径。%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。在上面的例子中,%1 和 PATH 可以被其他有效数值替换。%~ 语法被一个有效参数号码终止。%~ 修定符不能跟 %*使用d:\D-desktop>
5.2 提取和转化
5.2.1 %0和%~0的区别
如果%0对应的值不被引号包括,那么就没有任何区别,但是如果被引号包围,用%~0就能去除引号。
下图是双击执行main.bat文件的结果。
5.2.2 各个简写的记忆技巧.
d对应drive——驱动器
f对应filepath——文件路径(包括文件名)
p对应path——路径(不包括文件名)
n对应name——文件名
x对应Ext——扩展名
a对应attribute——属性
z对应siZe——大小
5.2.3 $PATH:的含义
%~$PATH:1——查找列在 PATH 环境变量的目录,并将 %1扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此修改符会扩展到空字符串。
从帮助信息很容易理解它的含义,但是当我双击执行结果正常、而用CMD命令执行结果却不正常时,我就迷糊又懵逼了。
详见本文的第六章,作为高难度部分,希望各位读者能和我一起想出这个问题的答案!
六、一些没有解决的问题放在最后,一起探讨?
6.1 双击执行bat文件和在cmd窗口用命令执行输出结果不同
bat文件代码如下
chcp 65001
@echo off
echo %0
echo %~0
echo %~dp0
echo %~f0
echo %~fs0
echo %~n0
echo %~s0
echo %~a0
echo %~t0
echo %~$PATH:0
echo %~dp$PATH:0
pause
6.1.1 直接执行bat文件
直接执行,结果如下图,不能说正常,只能说完全正常好吧???
6.1.2 命令执行bat文件
在cmd窗口通过命令执行(除了bat文件名本身,没有赋予其他参数), 结果如下。明显最后的echo %~$PATH:0和echo %~dp$PATH:0的输出结果出现异端,非常诡异。
6.1.3 问题适当联想
当bat文件代码如下所示
chcp 65001
@echo off
echo %0
echo %~0
echo %~f0
echo %1
echo %2
pause
不仅包括%0,还有%1和%2时, 直接双击执行bat文件,结果如下图
因为双击执行时除了%0其他的批处理参数都没有值,所以涉及到的参数全部输出ECHO is off。
【批处理DOS-CMD命令-汇总和小结】-批处理命令中的参数%0、%1、%2、%[0-9]、%0-9和批处理命令参数位置切换命令shift,dos命令中操作符%用法相关推荐
- 【批处理DOS-CMD命令-汇总和小结】-跳转、循环、条件命令(goto、errorlevel、if、for[读取、切分、提取字符串]、)cmd命令错误汇总,cmd错误
一.本文摘要 此文主要研究对代码分支化执行和重复利用的实现. 分支化执行指根据中途的实际执行结果决定下一步执行的代码,跳转的代码行号:分支化执行大概分为跳转执行.条件判断执行:因此,分支化执行基本是只 ...
- 【批处理DOS-CMD命令-汇总和小结】-CMD窗口的设置与操作命令(cd、title、mode、color、pause、chcp、exit、goto :eof)
一. 改变cmd窗口当前目录--资源管理器或cd 具体方法详见我的专栏中另一篇文章的章节1.5. [批处理DOS-CMD命令-汇总和小结]-文件与目录操作命令(md.rd.xcopy.dir.cd.s ...
- 【批处理DOS-CMD命令-汇总和小结】-将文件夹映射成虚拟磁盘——subst
一.subst命令的意义 有时候文件(夹)的目录很深,每一次打开的时候需要一直切换目录,有了镜像虚拟磁盘subst命令,临时地将文件夹映射成磁盘显示在我的电脑中,就会让工作变得更轻松,可以节约很多时间 ...
- 【批处理DOS-CMD命令-汇总和小结】-Cmd窗口中常用操作符(<、<<、<、>、>>、>、、、||、|、()、;、@、““、‘‘)
一.重定向操作符--<.<<.&<.>.>>.&> 1.1 清除重定向--<和> cmd>file //cmd ...
- 【批处理DOS-CMD命令-汇总和小结】-cmd扩展命令、扩展功能(cmd /e:on、cmd /e:off)
一.问题背景 在打印erase的帮助信息时,提示如果启用扩展命令,...,如果是这个命令出现还好,没有引起我的注意,但是我发觉好多命令的最后都有提到这个扩展功能了. 不得已去百度谷歌查一通,资料很少, ...
- 【批处理DOS-CMD命令-汇总和小结】-cmd的内部命令和外部命令怎么区分,CMD命令和运行(win+r)命令的区别,cmd的命令扩展(扩展命令)
一.cmd的内部命令和外部命令怎么区分? 区分规则很简单,在cmd窗口中用help命令能打印出来的命令都是cmd内部命令,没包括在里面的都是外部命令. D:\>help 有关某个命令的详细信息, ...
- 【批处理DOS-CMD命令-汇总和小结】-外部命令-cmd下载命令、抓包命令(wget)
一.wget下载程序的优势 1)支持断点下传功能 2)同时支持FTP和HTTP下载方式 3)支持代理服务器 4)设置方便简单 5)程序小,完全免费 二.下载和安装wget程序 wget的官网如下:Wg ...
- 【批处理DOS-CMD命令-汇总和小结】-应用程序启动和调用、服务和进程操作命令(start、call、)
一.程序启动命令--start start命令一般用来打开一个文件(通常是可执行程序)或文件夹,当然也可以是一个网址. 先用[start /?]命令大致了解帮助信息. 1.1 打开某一个文件夹--st ...
- 【批处理DOS-CMD命令-汇总和小结】-上网和网络通信相关命令(ping、telnet、nslookup、arp、tracert、ipconfig)
一.查看网络延迟和丢包情况--ping命令 1.1 查看ping的帮助信息--[ping /?] 执行命令[ping /?],打印帮助信息. 1.2 最基本的用法--[ping ip/域名] 查看本机 ...
最新文章
- 使用Filezilla Server配置FTP服务器
- Android FrameWork学习(二)Android系统源码调试
- java io字符输出流_JAVA IO 字符输入流与输出流总结说明
- P4148 简单题(KDTree)
- 【LeetCode笔记】剑指 Offer 06. 从尾到头打印链表(Java、翻转链表)
- java is a like a_JAVA基础——is-a 、have-a、和 like-a的区别
- beta分布的采样或抽样(java程序)
- linux安装php支持redis拓展
- 性能无敌的HikariCP数据库连接池实战(文末送书)
- 简单理解RocketMQ---入门
- Jenkins学习一:Jenkins是什么?
- ROSCon 2019 机器人操作系统国际盛会
- 物流项目介绍示范 有用
- photoshop高光,暗,中间调选区获取
- Open Images Dataset Detection Labels(openimage 检测类别的中文翻译)
- Sloth组件之NetRisc.Configuration源代码发布
- MTK6735 android 驱动修改模块
- ps4变更账号服务器,PSN ID怎么改?详细步骤教你如何更改PS4的PSN ID
- 【元胞自动机】激进策略元胞自动机三车道(开放辅路,软件园影响)交通流模型matlab源码
- 中国剩余定理【数论】
热门文章
- 影子系统PowerShadow原理研究
- 使用MedleyText与Syncthink自建云笔记
- 你用QQ注册过哪些网站/应用,想不想查询一下,然后取消授权呢?
- 人体骨骼关键点检测AP值AP@s
- ssm+jsp计算机毕业设计基于Java的藏文学习软件n61lu(程序+lw+源码+远程部署).
- 海狮号水下机器人_海狮(SeaLion)小型水下遥控机器人(ROV)
- 脑洞大开,献给“攻城狮”的情人节创意表白礼物【附开发教程】
- mems加速度计芯片的参数介绍
- 科技只是拐杖:技术影响人类创造力的悲观分析
- iOS——frame bounds