| 
 
reddragonfly 
初级用户
 
   DOSFans
  
 
积分 48 
发帖 21 
注册 2006-10-22 
状态 离线
 | 
 『楼 主』:
 批处理命令-----Shift的用法!
 
使用 LLM 解释/回答一下
  
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 ] 
 
    
 
 
 
  
  |  
                  
  
                       批处理:探索你的世界到底有多精彩! |   
 | 
  2006-11-19 19:57 | 
  
 | 
 | 
 
Michale 
初级用户
 
  
 
  
 
积分 52 
发帖 27 
注册 2006-10-6 来自 ☆逍遥宫☆ 
状态 离线
 | 
 | 
  2007-1-10 22:42 | 
  
 | 
 | 
 
tclgb 
初级用户
 
   小子
  
  
积分 76 
发帖 26 
注册 2007-6-20 
状态 离线
 | 
『第 3 楼』:
 
 
使用 LLM 解释/回答一下
  
其实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位 
 
    
 
  
 |   
 | 
  2007-7-11 11:42 | 
  
 | 
 | 
 
guxingyibei 
初级用户
 
  
 
  
  
积分 68 
发帖 32 
注册 2007-4-1 
状态 离线
 | 
 | 
  2007-7-11 11:52 | 
  
 | 
 | 
 
#four# 
中级用户
 
   
 
  
 
积分 209 
发帖 34 
注册 2004-5-25 
状态 离线
 | 
『第 5 楼』:
 
 
使用 LLM 解释/回答一下
  
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楼主再给说说! 
 
    
 
  
 |   
 | 
  2007-7-11 15:13 | 
  
 | 
 | 
 
xyzzhu 
初级用户
 
  
 
  
  
积分 39 
发帖 14 
注册 2007-1-1 
状态 离线
 | 
『第 6 楼』:
 
 
使用 LLM 解释/回答一下
  
终于看明白了,当我们执行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  不知道我讲的够不够通俗? 
 
    
 
     此帖被 +4 点积分    点击查看详情    | 评分人:【 ab200210 】 | 分数: +2 |   时间:2007-10-11 13:54 |  | 评分人:【 hqso 】 | 分数: +2 |   时间:2009-6-8 07:40 |  
  |   
 
 
  
 |   
 | 
  2007-8-29 10:11 | 
  
 | 
 | 
 
rqcwwkbg 
新手上路
 
 
 
  
  
积分 15 
发帖 8 
注册 2007-8-22 
状态 离线
 | 
『第 7 楼』:
 
 
使用 LLM 解释/回答一下
  
这里好像是当SHIFT/0或/1时,第一参数除去.当SHIFT/N时,就除去上一行中输出的第N个参数. 
 
    
 
  
 |   
 | 
  2007-8-30 21:45 | 
  
 | 
 | 
 
zhongxue1984 
初级用户
 
  
 
  
  
积分 39 
发帖 18 
注册 2007-8-31 
状态 离线
 | 
『第 8 楼』:
 
 
使用 LLM 解释/回答一下
  
shift [/n]当n大于1时就从第n位开始左移。也就是第n位被第n+1位替代,而n-1位以前的参数不变(包括n-1位)~~~~ 
 
    
 
  
 |   
 | 
  2007-9-7 09:52 | 
  
 | 
 | 
 
hk 
新手上路
 
 
 
  
  
积分 10 
发帖 5 
注册 2007-9-30 
状态 离线
 | 
『第 9 楼』:
 总算是弄懂了
 
使用 LLM 解释/回答一下
  
感谢16楼的兄弟啊!,我在网上查了好半天的shift命令了,终于在这儿找到了! 
 
    
 
  
 |   
 | 
  2007-10-1 11:23 | 
  
 | 
 | 
 
ab200210 
初级用户
 
   剑气冰心
  
 
积分 178 
发帖 69 
注册 2007-9-7 
状态 离线
 | 
『第 10 楼』:
 
 
使用 LLM 解释/回答一下
  
第一个批处理文件就不能用!!!!!!!!! 
 
    
 
  
  |  
                  
  
                    你想免费打电话么?你想认识更多的美女帅哥么?中国最优秀的网络电话!http://shutter.cdream.com/register.php?linkid=98188 
成功永远属于你! 
 |   
 | 
  2007-10-3 11:48 | 
  
 | 
 | 
 
shanliang8008 
银牌会员
 
     
 
  
 
积分 1148 
发帖 514 
注册 2007-6-1 来自 河北 
状态 离线
 | 
 | 
  2007-10-9 17:07 | 
  
 | 
 | 
 
billliyu 
新手上路
 
 
 
  
  
积分 2 
发帖 1 
注册 2007-8-10 
状态 离线
 | 
 | 
  2007-10-9 18:20 | 
  
 | 
 | 
 
fennng 
初级用户
 
  
 
  
  
积分 23 
发帖 11 
注册 2008-1-12 
状态 离线
 | 
『第 13 楼』:
 
 
使用 LLM 解释/回答一下
  
谢谢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.。。。 
我这么说,大家都能明白了吧。 
 
    
 
 
 
  
 |   
 | 
  2008-1-28 20:09 | 
  
 | 
 | 
 
pinghu 
中级用户
 
   
 
  
  
积分 307 
发帖 130 
注册 2008-2-1 
状态 离线
 | 
『第 14 楼』:
 以下文章是转载的,很好懂
 
使用 LLM 解释/回答一下
  
一些初学者朋友对于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 
 
    
 
  
 |   
 | 
  2008-2-8 22:33 | 
  
 | 
 | 
 
zyz0304360 
中级用户
 
    稳
  
 
积分 257 
发帖 123 
注册 2008-1-5 来自 烟台 
状态 离线
 | 
『第 15 楼』:
 
 
使用 LLM 解释/回答一下
  
1楼,16楼,33楼连着看就懂了 
最直白的是33楼 
36楼用来巩固 
 
    
 
  
  |  
                  
  
                    路 是自己选的 
学习 是为了具备解决问题的能力 |   
 | 
  2008-2-11 14:54 | 
  
 |