cmd move命令 移动文件(夹)
move,英文含义为“移动”,在批处理中,它可以把文件或文件夹从A处移动到B处。
很多时候,我看到有人在回复“如何把文件从A处移动到B处”的时候,给出的建议往往是:先用copy命令复制文件,然后用del和rd删除文件和文件夹。回复者根本没有想到,他给出的操作流程太繁琐了,他根本没有意识到,系统已经提供了直接移动文件的命令move!
  move的使用非常简单,基本格式为 move A B。在这里,A表示你想要执行移动操作的文件或文件夹,B表示A被移动后保存的位置,而A可以使用相对路径,也可以使用绝对路径,甚至可以使用通配符,但是,在move执行移动文件的功能的时候,B只能是目录路径,而不能是文件路径——很难想象,你要把a.txt文件移动到b.txt文件里去,操作系统会做何感想。比如: d:\test,表示把当前目录下的a.txt移动到d:\test目录下;move c:\ d:\,表示把C盘根目录下的文件移动到D盘根目录下;move c:\*.txt d:\表示把C盘根目录下的文本文件移动到D盘根目录下。
另外,需要特别注意的是:move不能跨分区移动文件夹。感谢zqz0012005的提醒。
  上面已经说过,如果你想把a.txt移动到b.txt文件里去,操作系统肯定会很不高兴。
  如果你确实要这么干呢?
  b.txt!
  你会发现,对于你的胡缠蛮搞,操作系统也没拦着你,它很顺从地执行了你的命令,但是,结果并没有像你所期望的那样,把a.txt放进b.txt里面去,而是把a.txt改名为b.txt了。
  原来,在 move A B 这样的命令中,move具备移动文件(夹)的基本功能,还兼有重命名文件(夹)的功效,具体起什么作用,视情况决定:
  1、如果A、B同为文件夹名,则把A移动到B目录下;
  2、如果A为文件名,
    ① B为文件夹名的时候,将把A移动到B目录下;
    ② B为文件名的时候,将把A重命名为B;如果B所在的位置为另一目录,则表示在把A移动到B所在的目录下的同时,重命名为B。
  一旦你明白了move的这些用法,重命名文件的时候,你将会很容易在ren和move之间做取舍:如果只是单纯地重命名文件,则ren和move任选其一即可,只是move的写法显得有点怪异而已;如果在要移动文件之后,还要重命名文件,选择 move c:\ d:\ 的写法将一步到位,而先 move c:\
< d:\abc 之后,再ren d:\ 1.txt 的写法将显得繁琐,最不可取的做法,是先copy,再del/rd,最后再ren,这是追求代码至精至简的人士所不能容忍的铺张浪费行为。
  有时候,move的过程并不会一帆风顺,比较常见的情形是:目
的地有重名文件存在,系统不到指定的文件。
  先说重名文件的情况。
  如果有重名文件出现,move不会成功,它会很体贴地询问你:改写××吗?(Yes/No/All):其中,××表示目的地的重名文件。如果选择Yes,将覆盖重名文件;如果选择No,则放弃move操作;如果选择All,则在批量move的时候,如果存在同名文件,将不再询问是否覆盖,而是直接覆盖掉重名文件。
  如果你嫌跳出这个提示信息很麻烦,而你的真正目的是强行覆盖所有的重名文件的话,给move加上个 /Y 的开关,写成 move /y A B就可以了——在cmd 窗口中,默认情况下,move 是带 /-y 开关的,也就是默认会出现重名文件的提示信息,只不过这个默认开关是可以省略的;而在批处理脚本中,move 默认带的是 /y 开关,不会出现重名提示而直接覆盖同名文件,和cmd窗口中的情形正好相反。
  再来看系统不到指定文件的情况。
  有时候,你会很奇怪,move A B 的时候,A明明是存在的,为什么还要不知趣地提醒你:“系统不到指定文件”呢?这不是在张口说瞎话么?
  不过,微软也挺无辜的:出错的情形太多了,要我对每一种出错情形都给出明确具体的原因,我哪有那么大的神通呀?我们搞技术的也不容易啊,能提醒你不到指定文件,我们已经尽力了,您老就多多包涵一下吧。
  得了,我们还是自己动手原因吧。
  原来,move没有dir的神通,它不能够识别出带隐藏或系统属性的文件,在这些文件面前,它成了瞎子,不过,这不能说move太无能,而是微软为了安全起见,限制了很多危险命令对带有隐藏或系统属性的文件进行直接操作——del、ren都是这副德性;而rd命令,则属于漏网之鱼,是个例外,要不然,微软的系统就不会有打补丁一说了。
  如何解决这一难题呢?
  没办法,只能老老实实地先用attrib命令去掉这些文件的隐藏或系统属性,再来move吧。至于在写批处理的时候,如何判断哪些文件需要先attrib之后再move,哪些文件可以直接move,则不属于本文要讨论的范畴,还请读者关注论坛的其他相关讨论话题。
删除文件用的是del命令,那么,是不是像ren命令通吃文件和文件夹一样,del是不是也可以删除文件夹呢?
答案是否定的,因为删除文件夹必须使用rd命令,这叫术业有专攻^_^。
  rd的另外一个写法是rmdir,源自ReMakeDirectory。使用的方法也很简单:rd 文件夹名 即可,例如:rd test。它支持带路径的文件夹名,例如:rd d:\test。
  有时候,rd并不能很好地完成任务:你让它删除test文件夹,它却傲慢地向你翻白眼:目录不是空的。不过
,这也不能怨它偷懒不干活,只是它的脾气有点怪:如果要删除的文件夹下面还有子文件,你得给rd戴顶高帽,加个 /s 参数,它才会高高兴兴地帮你做事,所以,正确的写法是:rd /s test。
  如果你是个彻头彻尾的懒鬼,光是使用 rd /s test ,可能还是对它不甚满意,因为当你在删除带子文件的文件夹的时候,CMD总是不识时务地停下来,殷勤地问你:是否确认(Y/N)?非得等你输个字符敲下回车不可。命苦不能怨政府,点背不能怨社会,谁叫rd有那么大的威力呢,它一旦耍起流氓来,那是谁也拦不住的——rd有风险,删除须谨慎啊。好在微软对那些对删除十分有把握而又懒得要命的家伙体贴入微,提供了一个十分方便的参数 /q ,它取自quiet,官方解释为:安静模式,带 /S 删除目录
树时不要求确认。这次再试试:rd /q /s test,真个是:弹指一挥间,灰飞烟灭,是不是有眼不见心不烦的酣畅感?
创建文件夹使用的是md命令,它的另一个写法为mkdir(由MakeDirectory演变而来),格式为:md 文件夹名,其中,文件夹名可以使用带路径的格式。
例如:md d:\test,也可以用 md test 在当前路径下建立test文件夹。
  如果要创建的文件夹带有空格或&,需要用引号把文件夹名括起来,例如:md "test abc"、md "abc&xyz"。如果不使用引号,又会带来什么后果呢?
  测试的结果是:
  1、如果文件夹名带空格,那么,md test abc 语句会在当前目录下创建test和abc这两个文件夹;利用这个特点,我们有时候可以收到化繁为简的奇效:如果要创建abc def xyz这三个文件夹,直接使用 md abc def xyz 就行了,而无需连写三条md语句。当然,md abc;def;xyz或者md abc,def,xyz 这样的写法也是可以的。
  2、如果文件夹名中含有&,那么,md abc&xyz 会创建abc这个文件夹,并提示说:'xyz'不是内部或外部命令,也不是可运行的程序或批处理文件,这是因为,&是复合语句的连接符号,它把前后两部分
视为两条子语句了。
  忠告:如果文件夹名含有特殊符号,请不要忘记使用双引号!
  md还有一个比较方便的功能:创建中级目录。也就是说,md a\b\c这样的命令,可以在当前目录下建立文件夹a,然后,在a下建立文件夹b,b之下再建立文件夹c,一气呵成,而无需先md a之后,再cd a,然后md b,再cd b,接着cd b,然后md c。
ren取自rename的前三个字母,name在英文中有“为……取名”的意思,而re是前缀,有“重新做某事”的含义,结合起来,rename就是重命名的含义。
ren 的用法很简单,其使用格式为:ren 旧文件 新文件名。例如,把改写为,使用 即可。
  需要注
意的是,旧文件可以使用绝对路径,也可以使用相对路径,但是,新文件名不能使用任何路径,只能是新的文件名,即使这个路径就是当前目录。例如:需要修改d:\这个文件的名字为的话,如果当前路径位于d:\test,那么,命令可以写成: 、ren d:\ ,但是,绝对不能写成ren d:\ d:\这样的格式。之所以会有这个古怪的规
定,可能是一旦把路径写成另外的目录,ren就具备了“移动文件+重命名文件”的功能了,这和它的定位不相符。
  虽然ren的用法很简单,但是,它的功能却很强大,这主要得益于ren支持*和?这两个通配符:*表示任意多个字符,?表示一个字符。例如,要把所有的以.txt作为后缀名的文件改为以.doc作为后缀名,使用ren *.txt *.doc 即可,简简单单的一条语句,瞬间就改动了大量的文件,CMD命令简洁而又不失强大的特点在这里体现得淋漓尽致。又例如,要把以abc字符串打头、并且只有5个字符的txt文件改名为以xyz字符串打头,那么,可以这样写:ren abc??.txt xyz??.txt。
  需要引起高度重视的是,ren在使用通配符的时候,它的匹配规则十分奇特且过于复杂,不适合新手理解,在此不再展开做详细的解释。若想了解其中的详情,请参考这篇帖子:这是不是ren的一个bug?www-dos/forum/viewthread.php?tid=29538。若确实需要使用通配符,建议熟读这篇帖子;若实在难以理解,则退而求其次,只用通配符做后缀名的修改工作,可以不用深究这些复杂的规则。
  ren还有一个十分奇特的属性:当文件具备隐藏属性或系统属性的时候,ren将不起作用,需要把文件的隐藏或系统属性去掉方可更名,对只读属性的文件,ren可顺利更名。这在很多时候给我们制造了很多麻烦:当你不知道要即将更名的文件是否具备隐藏或系统属性的时候,直接ren是很成问题的,;如果希望在重命名文件的时候,还必须保持原有的文件属性,则更加让人痛苦万分。
  怎么办?
  如果不介意文件的属性是否被改动,那么,保险的做法是,用 attrib -s -h 命令先去掉文件可能存在的系统属性或隐藏属性,然后再ren之;如果还要求更名后的文件要保持原有的属性的话,高效的做法是:先用for语句中的 %%~ai 扩展获取原文件的属性,经过处理之后保存到变量中去,然后用 attrib -s -h 去掉文件可能存在的系统属性或隐藏属性,ren之后,再读取保留在变量中的属性值,用 attrib 恢复原有的文件属性。
cmd goto命令 流程跳转
一般的批处理命令,都是按照自上而下的流程逐行执行的,也就是说,只有第一行的命令执行了
之后,才可能执行第二行,第二行执行完之后,再执行第三行……如此依次执行。
如果对不同的情况,需要执行不同的既定操作,若还是按照常规的执行流程的话,是无法完成任务的,这个时候,就需要引入流程跳转的概念,动用流程跳转语句 goto 了。流程跳转的含义是:改变默认的执行顺序,强制跳转到指定的位置执行特定的程序块。
  先来看个例子:假设需要判断用户输入的是A还是B,代码可以写成这样:
@echo off
set /p input=请输入字母A或B:
if "%input%"=="A" goto A
if "%input%"=="B" goto B
pause
exit
:A
echo 您输入的字母是A
pause
exit
:B
echo 您输入的字母是B
批处理文件怎么做
pause
exit   
按照一般的执行流程,所有的代码都会自上而下逐行执行一次,结果将显示"您输入的字母是A"和"您输入的字母是B"这两行内容,很显然,这是达不到我们的要求的;但是,实际的结果是:如果您输入的字母非A即B,则结果只会显示"您输入的字母是A"或者"您输入的字母是B";也就是说,代码的执行顺序发生了改变,不再一成不变地自上而下逐行执行了:当输入字母A后,将执行第一条if语句,此条语句执行后,将跳转到标签段:A,从而绕过了第一条if语句和:A之间的所有代码行;当输入字母B后,将执行头两条if语句,当执行完第二条if语句后,将跳转到标签段:B,从而绕过了第二条if语句和:B之间的所有代码行。
  从上面的例子可以看到,要让goto语句起作用,还需要:A或:B之类的标签段的配合。所谓的标签段,就是这样的一些代码块:在首行上以单个冒号打头,其后紧跟一串字符,第二行及其之后的所有行为代码语句行。在这里,第一行的冒号是标签标志,紧跟它之后的字符串是标签名,两者合称标签。goto语句后面的部分为标签名,指引着该语句执行完之后该跳到转何方,标签则接收goto语句的跳转指令,引导着goto语句的后续操作。goto语句和标签互相呼应,在实现流程跳转时相辅相成,缺一不可。
  下面说一下使用跳转语句goto的注意事项:
  1、goto语句和标签要互相呼应,不能只有goto语句而没有相应的标签段,否则,程序将不到相应的标签段而直接退出;只有标签段而没有goto语句是允许的,但不能实现流程跳转功能,从代码精简的角度来看,有标签段而没有goto语句,则此标签是多余的,可以精简掉;
  2、若有多个标签段,则需要注意标签段之间是否需要添加合适的退出语句来终止程序继续向下执行,这是很多新手很容易犯错的地方,需要谨慎。以上面这段代码为例,如果去掉:A和:B之间的exit语句,那么,当输入字母A之后,结果将同时显
示"您输入的字母是A"和"您输入的字母是B"这两行内容,而保留exit语句将只会在显示"您输入的字母是A"后,按任意键推出批处理程序,因为批处理是自上而下逐行执行的,即使用goto语句跳转之后,在新的位置上,这一执行流程仍然会保持,直到碰上另一个流程跳转语句,执行过程并不会在两个标签段之间自动终止。
  3、标签名只可以使用常量,而不能使用变量;
  4、若有同名的标签段,将执行位于最顶层的标签段,其后的标签段是否得到执行,将视具体的情况加以处理。
cmd if条件 条件判断
if用于条件判断,适用于以下情形
1、判断驱动器、文件或文件夹是否存在,用 if exist 语句;
  2、判断某两个字符串是否相等,用 if "字符串1"=="字符串2" 语句;
  3、判断某两个数值是否相等,用 if 数值1 equ 数值2 语句;
  4、判断某个变量是否已经被赋值,用 if defined str 语句;
  if语句的完整格式是这样的:if 条件表达式 (语句1) else (语句2),它的含义是:如果条件表达式成立,那么,就执行语句1,否则,将执行语句2。
  对于以上四种情形,可以分别使用如下代码:
  1、if exist d:\ (echo D盘下有存在) else (echo D盘下不存在)
  2、if "abc"=="xyz" (echo 字符串abc等于字符串xyz) else (echo 字符串abc不等于字符串xyz)
  3、if 1 equ 2 (echo 1等于2) else (echo 1不等于2)
  4、if defined str (echo 变量str已经被赋值,其值为%str%) else (echo 变量str的值为空)
  判断字符串是否相等的时候,if会区分大小写,比如,单纯的if语句会认为字符串abc和字符串Abc不相同,若不想区分大小写,则需要添加 /i 开关,使用 if /i "字符串1"=="字符串2" 的格式;另外,等于符号是连续的"=="而非单独的"="。
  判断两个数值之间的大小关系,除了等于用equ之外,还有其他的关系符号,所有适用于if语句的关系符号见下表:
中文含义 关系符 英文解释
等于 equ equal
大于 gtr greater than
大于或等于 geq greater than or equal
小于 lss less than
小于或等于 leq less than or equal
不等于 neq no equal
  if语句还有一个精简格式:if 条件表达式 语句,它的含义是:如果条件表达式成立,将执行语句,否则,什么也不做。
dos 内容重定向符 >
当我们在cmd窗口中查询某条命令的帮助信息的时候,帮助信息是显示在命令行窗口中的,命令行窗口关闭后,这些帮助信息就看不到了,如果下次还想看,又得在命令行窗口中输入查询命令,比较繁琐。
有没有办法把显示在命令行窗口中的帮助信息保存下来呢?
  答案是肯定的,并且有不止一种答案。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。