Board logo

标题: 批处理命令-----Shift的用法! [打印本页]

作者: reddragonfly     时间: 2006-11-19 19:57    标题: 批处理命令-----Shift的用法!
Shift是批处理内置命令中最不常用的,既然此处是以教学为目的的版块,那了解并掌握它就不容置疑啦! 批处理文件中可引用的参数为%0~%9,%0是指批处理文件的本身,也可以说是一个外部命令;%1~%9是批处理参数,也称形参;而替换形参的实参若超过了批处理文件中所规定数值(9个)且想在批处理文件中应用这些实参的话,shift命令可以帮你实现! Shift命令:更改批处理文件中可替换参数的位置 shift [/n] n的取值是[0,8],且为整数;[/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 ]

作者: Michale     时间: 2007-1-10 22:42
没发现规律~~ 感觉好象是?

作者: tclgb     时间: 2007-7-11 11:42
其实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位

作者: guxingyibei     时间: 2007-7-11 11:52
知道用法,但是实际中见的很少!不知道在哪里用

作者: #four#     时间: 2007-7-11 15:13
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楼主再给说说!

作者: xyzzhu     时间: 2007-8-29 10:11
终于看明白了,当我们执行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 不知道我讲的够不够通俗?

作者: rqcwwkbg     时间: 2007-8-30 21:45
这里好像是当SHIFT/0或/1时,第一参数除去.当SHIFT/N时,就除去上一行中输出的第N个参数.

作者: zhongxue1984     时间: 2007-9-7 09:52
shift [/n]当n大于1时就从第n位开始左移。也就是第n位被第n+1位替代,而n-1位以前的参数不变(包括n-1位)~~~~

作者: hk     时间: 2007-10-1 11:23    标题: 总算是弄懂了
感谢16楼的兄弟啊!,我在网上查了好半天的shift命令了,终于在这儿找到了!

作者: ab200210     时间: 2007-10-3 11:48
第一个批处理文件就不能用!!!!!!!!!

作者: shanliang8008     时间: 2007-10-9 17:07
恩 对于理解变量和女人有好处哈哈 C 语言真好

作者: billliyu     时间: 2007-10-9 18:20
好东西,谢谢楼主的分享

作者: fennng     时间: 2008-1-28 20:09
谢谢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.。。。 我这么说,大家都能明白了吧。

作者: pinghu     时间: 2008-2-8 22:33    标题: 以下文章是转载的,很好懂
一些初学者朋友对于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

作者: zyz0304360     时间: 2008-2-11 14:54
1楼,16楼,33楼连着看就懂了 最直白的是33楼 36楼用来巩固

作者: zyz0304360     时间: 2008-2-11 14:54
谢谢你们,我懂了

作者: zyz0304360     时间: 2008-2-11 14:58
更改批处理文件中可替换参数的位置。 SHIFT [/n] 如果命令扩展名被启用,SHIFT 命令支持/n 命令行开关;该命令行开关 命令从第 n 个参数开始移位;n 介于零和八之间。例如: SHIFT /2 会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。 跟33楼的抛位差不多一个意思 shift /n 用第n+1个参数代替第n个参数的位置 后续参数同上

作者: jiulong     时间: 2008-2-19 15:51
利用SHIFT /数字来移位显示到移位之后的数字,有意思

作者: wjmm     时间: 2008-6-26 09:22
Originally posted by guxingyibei at 2007-7-11 11:52 AM: 知道用法,但是实际中见的很少!不知道在哪里用
范例 以下批处理文件 Mycopy.bat 显示了如何使用包含任意数目批处理参数的 shift 命令。该批处理文件将一列文件复制到特定的目录。批处理参数由目录和文件名参数表示。 @echo off rem MYCOPY.BAT copies any number of files rem to a directory. rem The command uses the following syntax: rem mycopy dir file1 file2 ... set todir=%1 :getfile shift if "%1"=="" goto end copy %1 %todir% goto getfile :end set todir= echo All done

作者: jsunhj     时间: 2008-6-26 10:54
===b.bat=== @call a.bat 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ===a.bat=== @echo off&cls shift /3 ==>第3个参数3被去掉,于是传入的就是 1 2 4 5 6 7 8 9 10 echo %1 %2 %3 %4 %5 %6 %7 %8 %9 shift /4 ==>在上面剩余参数的基础上,再去掉第4个参数5,于是传入的就是 1 2 4 6 7 8 9 10 11 echo %1 %2 %3 %4 %5 %6 %7 %8 %9 shift /5 ==>在上面剩余参数的基础上,再去掉第5个参数7,于是传入的就是 1 2 4 6 8 9 10 11 12 echo %1 %2 %3 %4 %5 %6 %7 %8 %9 pause

作者: hisplay     时间: 2008-8-17 11:16
maple 不是内部命令?

作者: weizai3     时间: 2008-9-15 22:30
shift /0 时,参数从第零位数开始左移一位,结果为:2,3,4,5,6,7,8,9,10 shift /1 时,参数从第一位数开始左移一位,结果为:3,4,5,6,7,8,9,10,11 shift /2 时,参数从第二位数开始左移一位,结果为:3,5,6,7,8,9,10,11,12 shift /3 时,参数从第三位数开始左移一位,结果为:3,5,7,8,9,10,11,12,13 shift /4 时,参数从第四位数开始左移一位,结果为:3,5,7,9,10,11,12,13,14 shift /5 时,参数从第五位数开始左移一位,结果为:3,5,7,9,11,12,13,14,15 下面也就依次类推下去就OK了 看明白了吧。

作者: weizai3     时间: 2008-9-15 22:41
以上方法有点傻,一个比较理解的简单办法 SHIFT /N 也就是在目前有效值范围内去掉N(N=1,2,3,4.....)位置的数,就OK了。(N=0=1,明白吗?)

作者: 8417a     时间: 2010-1-8 14:45    标题: 哈哈
看了半天,从懂到不懂,又从不懂到懂。呵呵,总算清楚了。 就是去掉第N个,由后面的补上来。但是,并不影响最前面两个。

作者: js588     时间: 2010-3-8 12:22
学习了啊