zoukankan      html  css  js  c++  java
  • Dos命令完成文件拷贝

    Dos命令初阶--文件拷贝

     1、XCOPY命令

    可以在cmd中录入:XCOPY /? 即可查看帮助

    帮助:

    XCOPY
    
    
    Microsoft Windows [版本 6.2.9200]
    (c) 2012 Microsoft Corporation。保留所有权利。
    
    C:UsersAdministrator>xcopy /?
    复制文件和目录树。
    
    XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W]
                               [/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U]
                               [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z] [/B] [/J]
                               [/EXCLUDE:file1[+file2][+file3]...]
    
      source       指定要复制的文件。
      destination  指定新文件的位置和/或名称。
      /A           仅复制有存档属性集的文件,
                   但不更改属性。
      /M           仅复制有存档属性集的文件,
                   并关闭存档属性。
      /D:m-d-y     复制在指定日期或指定日期以后更改的文件。
                   如果没有提供日期,只复制那些
                   源时间比目标时间新的文件。
      /EXCLUDE:file1[+file2][+file3]...
                   指定含有字符串的文件列表。每个字符串
                   在文件中应位于单独的一行。如果任何
                   字符串与复制文件的绝对路径的任何部分相符,
                   则排除复制该文件。例如,
                   指定如 obj 或 .obj 的字符串会分别
                   排除目录 obj 下面的所有文件或带有
                   .obj 扩展名的所有文件。
      /P           创建每个目标文件之前提示你。
      /S           复制目录和子目录,不包括空目录。
      /E           复制目录和子目录,包括空目录。
                   与 /S /E 相同。可以用来修改 /T。
      /V           验证每个新文件的大小。
      /W           提示你在复制前按键。
      /C           即使有错误,也继续复制。
      /I           如果目标不存在,且要复制多个文件,
                   则假定目标必须是目录。
      /Q           复制时不显示文件名。
      /F           复制时显示完整的源文件名和目标文件名。
      /L           显示要复制的文件。
      /G           允许将加密文件复制到
                   不支持加密的目标。
      /H           也复制隐藏文件和系统文件。
      /R           覆盖只读文件。
      /T           创建目录结构,但不复制文件。不
                   包括空目录或子目录。/T /E 包括
                   空目录和子目录。
      /U           只复制已经存在于目标中的文件。
      /K           复制属性。一般的 Xcopy 会重置只读属性。
      /N           用生成的短名称复制。
      /O           复制文件所有权和 ACL 信息。
      /X           复制文件审核设置(隐含 /O)/Y           取消提示以确认要覆盖
                   现有目标文件。
      /-Y          要提示以确认要覆盖
                   现有目标文件。
      /Z           在可重新启动模式下复制网络文件。
      /B           复制符号链接本身与链接目标。
      /J           复制时不使用缓冲的 I/O。推荐复制大文件时使用。
    
    开关 /Y 可以预先在 COPYCMD 环境变量中设置。
    这可能被命令行上的 /-Y 覆盖。
    
    C:UsersAdministrator>

    认真读懂这些参数,即可写Copy命令了。

    简单的:

    xcopy source target

    下面介绍几种常见用法:

    1)拷贝文件

    将C盘的info.txt文件拷贝到D盘根目录。

    xcopy C:info.txt D:

    将命令保存到bat文件,然后在C盘创建info.txt,执行bat文件,即可在D盘看到。

    2)指定参数,强制覆盖

    如果重复执行,因为文件已经存在,则会给出提示

    我们加入强制执行参数:

    xcopy C:info.txt D:  /Y

    我们从上文的帮助中砍下其命令说明:

    /Y           取消提示以确认要覆盖
                   现有目标文件。
    /-Y          要提示以确认要覆盖
                   现有目标文件。

     然后,就可以重复执行,每次都会覆盖。 

    3)拷贝文件,只拷贝更新文件

    每次都强制copy,如果源文件比目标目录的文件,日期新,才copy怎么办呢?

    增加配置参数:D

    xcopy C:info.txt D:  /Y/D

    对应才参数说明:

    /D:m-d-y     复制在指定日期或指定日期以后更改的文件。
                   如果没有提供日期,只复制那些
                   源时间比目标时间新的文件。

    4)拷贝目录

    其实与拷贝文件类似。

    xcopy C:	est D:	est  /D/Y

    如果D: est文件夹不存在,则会自动创建。

    在C盘的test文件中创建文件和文件夹,即可进行Copy。

    第一次执行会出现提示:是文件还是目录。

    如何指定其为目录,无需客户判定呢?

    解决办法:默认是目录:/I

    xcopy C:	est D:	est2  /I/D/Y

    其使用说明:

     /I           如果目标不存在,且要复制多个文件,
                   则假定目标必须是目录。

    5)拷贝目录中包含子目录

    根据上面的脚本,只能复制当前目录下的文件及目录

    我们可以使用/S 或者/E

    xcopy C:	est D:	est2  /E/I/D/Y

    这样,其C: est下的所有文件,包括子目录与空目录,以及子目录的子目录文件,也都成功拷贝到了目标目录。

    /S与/E具体解释:

     /S           复制目录和子目录,不包括空目录。
      /E           复制目录和子目录,包括空目录。
                   与 /S /E 相同。可以用来修改 /T。

    6)如果Copy只读文件

    当文件Copy到目标目录,如果其是或者设置为只读文件,则无法覆盖。

    这时我们用到了参数/R

    xcopy C:	est D:	est  /E/R/I/D/Y

    具体解释:

    /R           覆盖只读文件。

    其他的命令参数,我们这里不再介绍,根据自己的需要,认真研究帮助文档。

    2、echo命令,增加描述

    通过XCOPY命令,可以很轻松的实现copy功能。为了让界面更友好,我们希望将执行的情况展现给用户。

    这时候就需要echo命令。

    在cmd中输入:echo /?查看帮助

    C:UsersAdministrator>echo /?
    显示信息,或启用或关闭命令回显。
    
      ECHO [ON | OFF]
      ECHO [message]
    
    要显示当前回显设置,键入不带参数的 ECHO

    几种常见功能介绍:

    1)输出提示信息

    格式:ECHO信息内容

    echo HelloWorld

    执行结果:

    2)作为控制批处理命令在执行时是否显示命令行自身的开关 

    格式:ECHO [ON|OFF]
    如果想关闭“ECHO OFF”命令行自身的显示,则需要在该命令行前加上“@”。

    在上图中,我们可以看到前面总是有路径信息,很烦,能否只展现dos命令执行信息呢?这就要用到ECHO OFF

    @echo OFF
    echo HelloWorld
    pause

    执行结果:

    看到了,cmd窗口只剩下dos命令了。简洁漂亮。

    3)echo还有其他功能,如改变背景色、输出文件等。这里不再介绍。

    3、SET命令,设置变量

    用户录入还需要给出具体的提示。

    但是,我们希望将文件拷贝到用户指定的目录中去。

    需要提供一个交互页面,指导用户进行操作。

    这就需要dos的set命令。用来设置变量。

    SET [variable=[string]] 

       variable   指定环境变量名。 
       string 指定要指派给变量的一系列字符串。 要显示当前环境变量,键入不带参数的 SET。 SET 命令不允许变量名含有等号。

    但获取变量时,用%variable%获取

    在cmd中可以输入:SET /? 查看详细帮助。

    1)设置变量

    例子:

    @echo OFF
    set name=Tom
    echo %name%

    2)给出输入提示,则需要/p参数

    SET /P variable=[promptString] 

    看一个helloworld的例子

    echo
    set /p name=请输入您的名字
    echo Hello %name%,welcome to dos world.
    pause

    3)用set命令进行简单计算  

    语法:

    SET /A expression 

    /A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式评估器很简单并以递减的优先权顺序支持下列操作。

    例子:1+1=2

    @echo OFF
    set /p expresion=请输入数学表达式
    set /a result = %expresion%
    echo %result%
    pause

    关于set可以进行计算的功能,还有很多详细的内容,这里不再多说,可以查询相关的资料。

    4)set用于字符串处理

    1)字符串替换

    语法:

    %var:str1=str2%  

    含义:将字符串变量%var%中的str1替换为str2

    例子:

    @echo OFF
    set var=坚持就是胜利
    echo 替换前的值为:"%var%"
    set var=%var:是=能%
    echo 替换后的值为:%var%
    pause

    执行结果:

    2)字符串截取

    语法:

    %var:~[m[,n]]% 

    方括号表示可选,%为变量标识符,var为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部) %PATH:~10,5%   

    例子:

    @echo OFF
    set var=坚持就是胜利
    echo 截取前:%var%%
    set var="%var:~0,2%"
    echo 截取后:%var%
    pause

    结果:

    截取长度可以为负数:

    语法:

    %var:~0,-2%

    含义:把字符串倒数第三位开始的所有值付给变量。

    负数,代表逆向。

    @echo OFF
    set var=坚持就是胜利
    echo 截取前:%var%%
    set var="%var:~0,-2%"
    echo 截取后:%var%
    pause

    结果:

    其实位置可以省略

    语法:

    %var:~-2%

    含义:从变量var字符串,从末尾开始,截取2个字符。

    @echo OFF
    set var=坚持就是胜利
    echo 截取前:%var%%
    set var="%var:~-2%"
    echo 截取后:%var%
    pause

    结果:

    4、IF命令,判断

     设置了路径,我们需要判断是否存在,通过IF语句

    在cmd中输入:IF /?  查看if语句的使用帮助。

    执行批处理程序中的条件处理。
    
    IF [NOT] ERRORLEVEL number command
    IF [NOT] string1==string2 command
    IF [NOT] EXIST filename command
    
      NOT               指定只有条件为 false 的情况下,Windows 才
                        应该执行该命令。
    
      ERRORLEVEL number 如果最后运行的程序返回一个等于或大于
                        指定数字的退出代码,指定条件为 true。
    
      string1==string2  如果指定的文字字符串匹配,指定条件为 true。
    
      EXIST filename    如果指定的文件名存在,指定条件为 true。
    
      command           如果符合条件,指定要执行的命令。如果指定的
                        条件为 FALSE,命令后可跟 ELSE 命令,该命令将
                        在 ELSE 关键字之后执行该命令。
    
    ELSE 子句必须出现在同一行上的 IF 之后。例如:
    
        IF EXIST filename. (
            del filename.
        ) ELSE (
            echo filename. missing.
        )
    
    由于 del 命令需要用新的一行终止,因此以下子句不会有效:
    
    IF EXIST filename. del filename. ELSE echo filename. missing
    
    由于 ELSE 命令必须与 IF 命令的尾端在同一行上,以下子句也
    不会有效:
    
        IF EXIST filename. del filename.
        ELSE echo filename. missing
    
    如果都放在同一行上,以下子句有效:
    
        IF EXIST filename. (del filename.) ELSE echo filename. missing
    
    如果命令扩展被启用,IF 会如下改变:
    
        IF [/I] string1 compare-op string2 command
        IF CMDEXTVERSION number command
        IF DEFINED variable command
    
    其中, compare-op 可以是:
    
        EQU - 等于
        NEQ - 不等于
        LSS - 小于
        LEQ - 小于或等于
        GTR - 大于
        GEQ - 大于或等于
    
    而 /I 开关(如果指定)说明要进行的字符串比较不分大小写。
    /I 开关可以用于 IF 的 string1==string2 的形式上。这些
    比较都是通用的;原因是,如果 string1 和 string2 都是
    由数字组成的,字符串会被转换成数字,进行数字比较。
    
    CMDEXTVERSION 条件的作用跟 ERRORLEVEL 的一样,除了它
    是在跟与命令扩展有关联的内部版本号比较。第一个版本
    是 1。每次对命令扩展有相当大的增强时,版本号会增加一个。
    命令扩展被停用时,CMDEXTVERSION 条件不是真的。
    
    如果已定义环境变量,DEFINED 条件的作用跟 EXIST 的一样,
    除了它取得一个环境变量,返回的结果是 true。
    
    如果没有名为 ERRORLEVEL 的环境变量,%ERRORLEVEL%
    会扩充为 ERROLEVEL 当前数值的字符串表达式;否则,你会得到
    其数值。运行程序后,以下语句说明 ERRORLEVEL 的用法:
    
        goto answer%ERRORLEVEL%
        :answer0
        echo Program had return code 0
        :answer1
        echo Program had return code 1
    
    你也可以使用以上的数字比较:
    
        IF %ERRORLEVEL% LEQ 1 goto okay
    
    如果没有名为 CMDCMDLINE 的环境变量,%CMDCMDLINE%
    将在 CMD.EXE 进行任何处理前扩充为传递给 CMD.EXE 的原始
    命令行;否则,你会得到其数值。
    
    如果没有名为 CMDEXTVERSION 的环境变量,
    %CMDEXTVERSION% 会扩充为 CMDEXTVERSION 当前数值的
    字串符表达式;否则,你会得到其数值。
    IF帮助

     这里举两个简单例子

    1)判断字符串

    @echo OFF
    SET /P var=是否继续执行,请输入Y或N
    ECHO 输入的值为:"%var%"
    IF "%var%"=="Y" (
        echo 继续执行...
    )ELSE (
        echo 退出中...
    )
        
    pause

     2)判断文件是否存在

    @echo OFF
    set /P var=请输入文件名,包括文件路径,如:C:Info.txt
    echo 输入的值为:"%var%"
    if exist %var%. (echo 文件存在. ) else echo 文件不存在.    
    pause

    备注:if与else在同一行中 

    如果是分行处理,一定要保证括号附近有空格,否则会报语法错误,如下:

    @echo OFF
    set /P var=请输入文件名,包括文件路径,如:C:Info.txt  
    echo 输入的值为:"%var%"
    if exist %var% (
    echo 文件存在
    ) else (
    echo 文件不存在
    )    
    pause

    执行结果:

    5、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 

    6、pause命令,暂停批处理程序

    暂停批处理程序,并显示以下消息:
    请按任意键继续. . . 

    7、rem命令,注释

    为了bat脚本更好看,需添加注释,就需要rem命令

    语法:

    REM [COMMENT]

    在文件开头写说明性文字如:

    REM 拷贝文件
    REM CREATEBY YANK
    REM 2014-08-25

     如果注释多行,可以采取goto语句

    goto Main
    拷贝文件
    CREATEBY YANK
    2014-08-25
    :Main

     最后的拷贝脚本如下:

    goto MAIN
    拷贝文件
    CREATEBY YANK
    2014-08-25
    :MAIN
    
    @echo off
    echo "Copy start"
    
    echo 请输入需要拷贝的目标路径
    echo 请输入target的路径,如:D:target
    :SETTARGET
    set /p target=请输入target的路径:
    if "%target%"=="" (
        echo 未输入target的路径
        echo 补丁文件安装失败
        echo 退出...
        pause
        goto QUIT
    )
    if not exist "%target%" (
        echo 输入的target地址不存在,请检查后重新输入
        goto SETTARGET
    ) else (
        xcopy C:	est %target%  /E/R/I/D/Y
    )
    
    :QUIT

    其他 

    1、bat执行,汉字出现乱码

    找了很多,最终,将bat文件用记事本打开,另存为ANSI格式即可。之前是UTF-8。

  • 相关阅读:
    Python并发编程-concurrent包
    Python并发编程-多进程
    Python并发编程-GIL全局解释器锁
    .net解析csv(C#导表工具)
    为游戏适配刘海屏
    Lua rawget rawset newindex 函数定义和例子
    lua_local变量在new时不会被清空
    Lua查找表元素过程(元表、__index方法是如何工作的)
    为什么不使用github的wiki而是使用mkdocs做文档管理?
    Unity重置Animator到初始状态和重复播放同一个Animation
  • 原文地址:https://www.cnblogs.com/yank/p/3926643.html
Copyright © 2011-2022 走看看