中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 高手请帮我看看这段代码是什么意思?
作者:
标题: 高手请帮我看看这段代码是什么意思? 上一主题 | 下一主题
gool123456
初级用户




积分 89
发帖 76
注册 2009-12-13
状态 离线
『楼 主』:  高手请帮我看看这段代码是什么意思?

@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

代码中的中的红色部分实在不懂,望高手详细解析,谢谢!

2010-3-9 15:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
gool123456
初级用户




积分 89
发帖 76
注册 2009-12-13
状态 离线
『第 2 楼』:  

代码是从这帖子19楼载录来的:http://www.cn-dos.net/forum/view ... ghlight=&page=2

2010-3-9 15:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 3 楼』:  

:getfile 和 goto getfile 构成循环
if "%1"=="" goto end 和 :end 设置跳出循环的条件、标签
copy %1 %todir% 复制操作
set todir=%1 将参数赋值给变量
shift 命令在循环中将每个参数复制到前一个参数中,即循环中,%1在变,%todir%不变,从而实现将一列文件复制到某一固定目录

[ Last edited by Hanyeguxing on 2010-3-9 at 19:45 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-3-9 19:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
gool123456
初级用户




积分 89
发帖 76
注册 2009-12-13
状态 离线
『第 4 楼』:  

很感谢二楼的回答!
我想问的是:那%1和%todir%分别指的是什么,这里的%1有什么用?

2010-3-9 23:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by gool123456 at 2010-3-9 23:33:
很感谢二楼的回答!
我想问的是:那%1和%todir%分别指的是什么,这里的%1有什么用?

%是依次传递的参数。MYCOPY.BAT后跟的是什么,什么就作为参数。。。
例如:MYCOPY.BAT 2.txt 2.txt 3.txt 4.txt

[ Last edited by Hanyeguxing on 2010-3-9 at 23:44 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-3-9 23:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
gool123456
初级用户




积分 89
发帖 76
注册 2009-12-13
状态 离线
『第 6 楼』:  

很感谢Hanyeguxing的热心回答!
那请问%1和%todir%分别指的是什么,这里的%1有什么用?

因为我对%mun参数不怎么熟悉。。

2010-3-9 23:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by gool123456 at 2010-3-9 23:42:
很感谢Hanyeguxing的热心回答!
那请问%1和%todir%分别指的是什么,这里的%1有什么用?

因为我对%mun参数不怎么熟悉。。

使用批处理参数:
hh.exe C:\WINDOWS\Help\ntcmds.chm::/percent.htm

Shift的使用
hh.exe C:\WINDOWS\Help\ntcmds.chm::/shift.htm


使用批处理参数可以在批处理文件内的任何地方使用批处理参数,以提取有关环境设置的信息。

Cmd.exe 提供批处理参数扩展变量(%0 到 %9)。当在批处理文件中使用批处理参数时,%0 将由批处理文件名替换,而 %1 到 %9 将由在命令行键入的相应参数替换。要访问大于 %9 的参数,必须使用 shift 命令。有关 Shift 命令的详细信息,请参阅 Shift。%* 批处理参数是所有参数(不包括 %0)可引用的通配符,这些参数传递到批处理文件中。

例如,要将 Folder1 中的内容复制到 Folder2,其中 %1 和 %2 将分别由值 Folder1 和 Folder2 替换,请在批处理文件 Mybatch.bat 中键入如下内容:

xcopy %1\*.* %2

要运行该文件,请键入:

mybatch.bat C:\folder1 D:\folder2

这与在批处理文件中键入如下内容是等效的:

xcopy C:\folder1 \*.* D:\folder2

也可以在批处理参数中使用编辑符。编辑符使用当前的驱动器和目录信息将批处理参数扩展为部分或完整的文件或目录名。要使用编辑符,请键入百分号 (%) 字符,后面是波形符号 (~) 字符,然后键入合适的编辑符(即 %~modifier)。

下表列出了可在扩展中使用的编辑符。

编辑符 说明
%~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。
%* 编辑符是唯一可代表在批处理文件中传递的所有参数的编辑符。不能将该编辑符与 %~ 编辑符组合使用。%~ 语法必须通过有效的参数值来终止。

不能以与使用环境变量相同的方式使用批处理参数。不能搜索或替换值,或检查子字符串。然而,可以将参数分配给环境变量,然后使用该环境变量。

Shift更改批处理文件中批处理参数的位置。

语法
shift

参数

注释
将 shift 命令行选项与命令扩展一起使用
启用命令扩展(默认设置)后,shift 命令支持 /n 命令行选项,该选项通知命令在第 n 个参数处开始更改,n 可以是 0 到 8 的任何一个值。例如,

SHIFT /2

可以将 %3 改为 %2,将 %4 改为 %3 等等,而 %0 和 %1 保持不变。

shift 命令的工作原理
shift 命令通过将每个参数复制到前一个参数中,更改批处理参数 %0 到 %9 的值。也就是说,将 %1 的值复制到 %0,%2 的值复制到 %1,依次类推。该命令在撰写对任何数目的参数执行相同操作的批处理文件时非常有用。

使用 10 个以上的批处理参数
也可以使用 shift 命令创建可以接受 10 个以上批处理参数的批处理文件。如果在命令行上指定了 10 个以上的参数,第十个 (%9) 参数之后的参数将更改为 %9,一次更改一个。

将 %* 与 shift 一起使用
Shift 对 %* 批处理参数没有影响。

恢复参数
没有反向的 shift 命令。执行了 shift 命令后,不能恢复更改前存在的第一个批处理参数 (%0)。

范例
以下批处理文件 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

[ Last edited by Hanyeguxing on 2010-3-9 at 23:48 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-3-9 23:46
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
gool123456
初级用户




积分 89
发帖 76
注册 2009-12-13
状态 离线
『第 8 楼』:  

Hanyeguxing兄这么一说,我明白这里的shift在这个批处理的作用了!谢谢。

2010-3-9 23:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: