中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-08 11:23
47,811 主题排行 / 349,895 发帖 / 今日 0 篇 / 48,253 会员排行
DOS学习入门 & 精彩文章 (教学室) » 批处理命令-----Shift的用法!
可打印版本  9,860 / 24
第1楼 reddragonfly 发表于 2006-11-19 19:57
初级用户 发帖 21 积分 48
批处理命令-----Shift的用法!
Shift是批处理内置命令中最不常用的,既然此处是以教学为目的的版块,那了解并掌握它就不容置疑啦!
批处理文件中可引用的参数为%0~%9,%0是指批处理文件的本身,也可以说是一个外部命令;%1~%9是批处理参数,也称形参;而替换形参的实参若超过了批处理文件中所规定数值(9个)且想在批处理文件中应用这些实参的话,shift命令可以帮你实现!
Shift命令:更改批处理文件中可替换参数的位置
shift
n的取值是,且为整数;为可选参数,当赋予n某个值时,就意味着命令从第n个参数开始移位;当n赋予的值为0,1或不带有任何命令选项的shift时,则表示批处理文件中替换参数左移一个位置,后面的替换参数陆续填补上去,直至可替换参数为空。

For example:

在D盘下编辑一批处理文件maple.bat;

@echo off
cls
echo %1 %2 %3 %4 %5 %6 %7 %8 %9
shift /0
echo %1 %2 %3 %4 %5 %6 %7 %8 %9
shift /1
echo %1 %2 %3 %4 %5 %6 %7 %8 %9
shift /2
echo %1 %2 %3 %4 %5 %6 %7 %8 %9
shift /3
echo %1 %2 %3 %4 %5 %6 %7 %8 %9
shift /4
echo %1 %2 %3 %4 %5 %6 %7 %8 %9
shift /5
echo %1 %2 %3 %4 %5 %6 %7 %8 %9
shift /6
echo %1 %2 %3 %4 %5 %6 %7 %8 %9
shift /7
echo %1 %2 %3 %4 %5 %6 %7 %8 %9
shift /8
echo %1 %2 %3 %4 %5 %6 %7 %8 %9
pause 1>nul


然后在命令提示符d:\下输入maple 1 2 3 4 ......17显示执行结果,就知晓其中的规律啦!

D:\>maple 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 10
3 4 5 6 7 8 9 10 11
3 5 6 7 8 9 10 11 12
3 5 7 8 9 10 11 12 13
3 5 7 9 10 11 12 13 14
3 5 7 9 11 12 13 14 15
3 5 7 9 11 13 14 15 16
3 5 7 9 11 13 15 16 17
3 5 7 9 11 13 15 17

[ Last edited by reddragonfly on 2006-11-19 at 08:03 PM ]
第2楼 Michale 发表于 2007-01-10 22:42
初级用户 发帖 27 积分 52 来自 ☆逍遥宫☆
没发现规律~~

感觉好象是?
第3楼 tclgb 发表于 2007-07-11 11:42
初级用户 发帖 26 积分 76
其实shift /?里面说的蛮清楚的
更改批处理文件中可替换参数的位置。

SHIFT [/n]

如果命令扩展名被启用,SHIFT 命令支持/n 命令行开关;该命令行开关
命令从第 n 个参数开始移位;n 介于零和八之间。例如:

SHIFT /2

会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。

楼主说的规律我不太清楚
不过:shift /0 和shift /1的效果是一样的
之后的shift /n 就是将 %n+1 移位到 %n,但不影响前面n-1位
第4楼 guxingyibei 发表于 2007-07-11 11:52
初级用户 发帖 32 积分 68
知道用法,但是实际中见的很少!不知道在哪里用
第5楼 #four# 发表于 2007-07-11 15:13
中级用户 发帖 34 积分 209
D:\>maple 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 10
3 4 5 6 7 8 9 10 11
3 5 6 7 8 9 10 11 12
3 5 7 8 9 10 11 12 13
3 5 7 9 10 11 12 13 14
3 5 7 9 11 12 13 14 15
3 5 7 9 11 13 14 15 16
3 5 7 9 11 13 15 16 17
3 5 7 9 11 13 15 17



前三行好像还有规律,后面的为什么看不出来有什么规律,为什么会少4,6楼主再给说说!
第6楼 xyzzhu 发表于 2007-08-29 10:11
初级用户 发帖 14 积分 39
终于看明白了,当我们执行maple 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17后,那么我们就给了maple 赋了17个实际参数,我们在使用的时候最多只能显示其中的9个参数:echo %1 %2 %3 %4 %5 %6 %7 %8 %9 如果我们要在实际中使用第15个实际的参数,我们怎么办?这时我们就会使用到shift命令,shift/n 的意思就是把17个参数中的第n 个去掉的意思,于是我就就可以使用后面的参数,至于为什么后面的结果没有6和8?因为批处理是把上一行的结果的第N个参数去掉,如倒数第二行显示的是:3 5 7 9 11 13 15 16 17 执行shift 8 后,即去掉了16 所以最后一行显示的是:3 5 7 9 11 13 15 17 不知道我讲的够不够通俗?
第7楼 rqcwwkbg 发表于 2007-08-30 21:45
新手上路 发帖 8 积分 15
这里好像是当SHIFT/0或/1时,第一参数除去.当SHIFT/N时,就除去上一行中输出的第N个参数.
第8楼 zhongxue1984 发表于 2007-09-07 09:52
初级用户 发帖 18 积分 39
shift [/n]当n大于1时就从第n位开始左移。也就是第n位被第n+1位替代,而n-1位以前的参数不变(包括n-1位)~~~~
第9楼 hk 发表于 2007-10-01 11:23
新手上路 发帖 5 积分 10
总算是弄懂了
感谢16楼的兄弟啊!,我在网上查了好半天的shift命令了,终于在这儿找到了!
第10楼 ab200210 发表于 2007-10-03 11:48
初级用户 发帖 69 积分 178
第一个批处理文件就不能用!!!!!!!!!
第11楼 shanliang8008 发表于 2007-10-09 17:07
银牌会员 发帖 514 积分 1,148 来自 河北
恩 对于理解变量和女人有好处哈哈

C 语言真好
第12楼 billliyu 发表于 2007-10-09 18:20
新手上路 发帖 1 积分 2
好东西,谢谢楼主的分享
第13楼 fennng 发表于 2008-01-28 20:09
初级用户 发帖 11 积分 23
谢谢16楼,我也看懂了。
shift 谁就把谁扔掉。他后面的就跟上来了。
shift 0 扔掉第一个,所以参数就从2开始了这个时时候 %1已经是2了。
shift 1 扔掉第一个, 所以把%1扔掉了,%1在上面已经变成2了,其实扔的是2所以从3开始了。
shfit 2 扔掉第二个,这时候因为是从第3开始的,第二个其实是4,所以把4扔了。变成3567.。。。17

shift 3 扔掉第三个,上面的第三个是6,所以扔掉6.。。。
我这么说,大家都能明白了吧。
第14楼 pinghu 发表于 2008-02-08 22:33
中级用户 发帖 130 积分 307
以下文章是转载的,很好懂
一些初学者朋友对于shift命令感到非常的困惑,抱怨网上的一些shift命令教程很难理解。为了解决这个问题,于是我就写了一下这个
“超生游击队”教程以供初学者朋友参考。

言归正传,比如我老爸有10个儿子,我英雄是第10个。

第一步:
我们现在用一个另类的办法输出10个儿子的名字,将如下代码保存为hero.bat。
@echo off
echo %1
echo %2
echo %3
echo %4
echo %5
echo %6
echo %7
echo %8
echo %9
echo %10
pause
如何运行呢?我们可以另写一个bat,内容是:call hero.bat 老大 老二 老三 …… 英雄
也就是调用hero.bat并共带10个参数!
能正确运行吗?不能,很遗憾,因为根本没有%10。


第二步:
在上一步中没有输出我英雄的大名,那难道我英雄就不是我老爸的儿子吗!我得想个办法把我的名字也输出来。
好了,借助shift命令就可以达到。我们把hero.bat中的代码改一下。
@echo off
echo %1
echo %2
echo %3
echo %4
echo %5
echo %6
echo %7
echo %8
echo %9
shift
echo %9
pause
终于我的大名输出了。可是英雄明明是第10个参数呀,怎么现在变成第9个了?
这个就是shift的功能.

也就是,执行shift命令以后,原来的%9变成了%8,原来的%8变成了%7,原来的%7变成了%6……而原来的%1变成了%0,此时原来的%0没了。
也就是说后面的参数依次冲掉了前面的参数,而为了输出我的名字,最终牺牲了%0。


第三步:
我老爸又认了4个干儿子,名字分别为a,b,c,d
到此,我老爸有多了4个干儿子。共14个儿子。

在调用hero.bat时又多了4个参数,则运行hero.bat时有:call hero.bat 老大 老二 老三 …… 英雄 a b c d
(注意:要把省略号换成名字。)


此时,hero.bat的代码如下:(最容易理解的方法)

@echo off
echo %1
echo %2
echo %3
echo %4
echo %5
echo %6
echo %7
echo %8
echo %9
shift
echo %9
::现在的%9是英雄

shift
echo %9
::现在的%9是a

shift
echo %9
::现在的%9是b

shift
echo %9
::现在的%9是c

shift
echo %9
::现在的%9是d

pause
第15楼 zyz0304360 发表于 2008-02-11 14:54
中级用户 发帖 123 积分 257 来自 烟台
1楼,16楼,33楼连着看就懂了
最直白的是33楼
36楼用来巩固
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023