zoukankan      html  css  js  c++  java
  • 批处理学习:基础语法

    批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd(.bat是dos下的批处理文件,.cmd是nt内核命令行环境的另一种批处理文件)。
    在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们。
    使用批处理文件(也被称为批处理程序或脚本),可以简化日常或重复性任务。

    一、参数

    1、系统参数

    %CD%            ===  当前路径 current directory
    %SystemRoot%    ===  C:\WINDOWS (%windir% 同样)
    %ProgramFiles%  ===  C:\Program Files
    %USERPROFILE%   ===  C:\Documents and Settings\Administrator (子目录有“桌面”,“开始菜单”,“收藏夹”等)
    %APPDATA%       ===  C:\Documents and Settings\Administrator\Application Data
    %TEMP%          ===  C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp (%TEM% 同样)
    %APPDATA%       ===  C:\Documents and Settings\Administrator\Application Data
    %OS%            ===  Windows_NT (系统)
    %Path%          ===  %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem (原本的设置)
    %HOMEDRIVE%     ===  C: (系统盘)
    %HOMEPATH%      ===  \Documents and Settings\Administrator
    
    :: 枚举当前的环境变量
    setlocal enabledelayedexpansion
    FOR /F "usebackq delims==" %%i IN (`set`) DO @echo %%i  !%%i!

    2、传递参数给批处理文件

    %[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。
    变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用 %1 到 %9 顺序表示。

    Sample1:执行同目录下的“test2.bat”文件,并输入两个参数

    call test2.bat "hello" "haha" 
    在“test2.bat”文件里写:
    echo %0  (打印: test2.bat)
    echo %1  (打印: "hello")
    echo %2  (打印: "haha")
    echo %19 (打印: "hello"9)

    Sample2:
    当我们要建立一个IPC$连接地时候总要输入一大串命令,弄不好就打错了,所以我们不如把一些固定命令写入一个批处理,把肉鸡地ip password username 当着参数来赋给这个批处理,这样就不用每次都打命令了。

    @echo off
    @net use ////1%//ipc$ "2%" /u:"3%" 注意哦,这里PASSWORD是第二个参数。
    @if errorlevel 1 echo connection failed

    二、简单批处理内部命令简介

    1、Echo 命令
    打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。
    语法
    echo [{ on|off }] [message]
    Sample:@echo off / echo hello world
    在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定格式的文件中,这将在以后的例子中体现出来。

    2、@ 命令
    表示不显示@后面的命令,在入侵过程中(例如使用批处理来格式化敌人的硬盘)自然不能让对方看到你使用的命令啦。
    Sample:@echo off
    @echo Now initializing the program,please wait a minite...
    @format X: /q/u/autoset (format 这个命令是不可以使用/y这个参数的,可喜的是微软留了个autoset这个参数给我们,效果和/y是一样的。)
    Sample2: @echo off
      del test.doc 2>nul
    1>nul 意思是不显示命令运行的正确提示;
    2>nul 意思是不显示错误提示;
    >nul    意思是屏蔽命令输出内容。

    3、Goto 命令
    指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。
    语法:goto label (label是参数,指定所要转向的批处理程序中的行。)
    Sample:
    if { %1 }=={ } goto noparms
    if { %2 }=={ } goto noparms(如果这里的if、%1、%2你不明白的话,先跳过去,后面会有详细的解释。)
    @Rem check parameters if null show usage
    :noparms
    echo Usage: monitor.bat ServerIP PortNumber
    goto end
    标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:用来表示这个字母是标签,goto命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。

    4、Rem 命令 (小技巧:用::代替rem)
    注释命令,在C语言中相当与/*--------*/,它并不会被执行,只是起一个注释的作用,便于别人阅读和你自己日后修改。
    Rem Message
    Sample:@Rem Here is the description.

    :: 确实可以起到rem 的注释作用, 而且更简洁有效; 但有两点需要注意:
    第一, 除了 :: 之外, 任何以 :开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容, 只是为了与正常的标号相区别, 建议使用 goto 所无法识别的标号, 即在 :后紧跟一个非字母数字的一个特殊符号。
    第 二, 与rem 不同的是, ::后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比 :: 更为适用; 另外, rem 可以用于 config.sys 文件中。

    5、Pause 命令
    运行 Pause 命令时,将显示下面的消息:
    Press any key to continue . . .
    Sample:
    @echo off
    :begin
    copy a:*.* d://back
    echo Please put a new disk into driver A
    pause
    goto begin
    在这个例子中,驱动器 A 中磁盘上的所有文件均复制到d://back中。显示的注释提示您将另一张磁盘放入驱动器 A 时,pause 命令会使程序挂起,以便您更换磁盘,然后按任意键继续处理。

    6、Call 命令
    从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。
    语法
    call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
    参数
    [Drive: }[Path] FileName
    指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd 扩展名。

    7、start 命令
    调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。
    入侵常用参数:
    MIN 开始时窗口最小化
    SEPARATE 在分开的空间内开始 16 位 Windows 程序
    HIGH 在 HIGH 优先级类别开始应用程序
    REALTIME 在 REALTIME 优先级类别开始应用程序
    WAIT 启动应用程序并等候它结束
    parameters 这些为传送到命令/程序的参数
    执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用程序终止就返回命令提示。如果在命令脚本内执行,该新行为则不会发生。

    8、choice 命令
    choice 使用此命令可以让用户输入一个字符,从而运行不同的命令。使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为1234……
    如: choice /c:dme defrag,mem,end
    将显示
    defrag,mem,end[D,M,E]?
    Sample:
    Sample.bat的内容如下:
    @echo off
    choice /c:dme defrag,mem,end
    if errorlevel 3 goto defrag (应先判断数值最高的错误码)
    if errorlevel 2 goto mem
    if errotlevel 1 goto end

    :defrag
    c://dos//defrag
    goto end
    :mem
    mem
    goto end
    :end
    echo good bye

    此文件运行后,将显示 defrag,mem,end[D,M,E]? 用户可选择d m e ,然后if语句将作出判断,d表示执行标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每个程序段最后都以goto end将程序跳到end标号处,然后程序将显示good bye,文件结束。

    9、If 命令
    if 表示将判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式:
    (1) if "参数" == "字符串" 待执行的命令
    参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)
    如if "%1"=="a" format a:
    if { %1 }=={ } goto noparms
    if { %2 }=={ } goto noparms

    (2) if exist 文件名  待执行的命令
    如果有指定的文件,则条件成立,运行命令,否则运行下一句。
    如if exist config.sys edit config.sys

    (3) if errorlevel / if not errorlevel 数字 待执行的命令
    如果返回码等于指定的数字,则条件成立,运行命令,否则运行下一句。
    如if errorlevel 2 goto x2  
    DOS程序运行时都会返回一个数字给DOS,称为错误码errorlevel或称返回码,常见的返回码为0、1。
    以下就是几个常用命令的返回值及其代表的意义:

    backup
    0 备份成功
    1 未找到备份文件
    2 文件共享冲突阻止备份完成
    3 用户用ctrl-c中止备份
    4 由于致命的错误使备份操作中止

    diskcomp
    0 盘比较相同
    1 盘比较不同
    2 用户通过ctrl-c中止比较操作
    3 由于致命的错误使比较操作中止
    4 预置错误中止比较

    diskcopy
    0 盘拷贝操作成功
    1 非致命盘读/写错
    2 用户通过ctrl-c结束拷贝操作
    3 因致命的处理错误使盘拷贝中止
    4 预置错误阻止拷贝操作

    format
    0 格式化成功
    3 用户通过ctrl-c中止格式化处理
    4 因致命的处理错误使格式化中止
    5 在提示"proceed with format(y/n)?"下用户键入n结束

    xcopy
    0 成功拷贝文件
    1 未找到拷贝文件
    2 用户通过ctrl-c中止拷贝操作
    4 预置错误阻止文件拷贝操作
    5 拷贝过程中写盘错误

    chkdsk
    0 未找到错误
    255 找到一个或多个错误

    choice
    0 用户按下ctrl+c/break
    1 用户按下第一个键
    255 检测到命令行中的错误条件
    其它 用户按下的有效字符在列表中的位置

    defrag
    0 碎片压缩成功
    1 出现内部错误
    2 磁盘上没有空簇。要运行DEFRAG,至少要有一个空簇
    3 用户用Ctrl+C退出了DEFRAG
    4 出现一般性错误
    5 DEFRAG在读簇时遇到错误
    6 DEFRAG在写簇时遇到错误
    7 分配空间有错
    8 内存错
    9 没有足够空间来压缩磁盘碎片

    deltree
    0 成功地删除一个目录

    diskcomp
    0 两盘相同
    1 发现不同
    2 按CTRL+C 终止了比较
    3 出现严重错误
    4 出现初始化错误

    find
    0 查找成功且至少找到了一个匹配的字符串
    1 查找成功但没找到匹配的字符串
    2 查找中出现了错误

    keyb
    0 键盘定义文件装入成功
    1 使用了非法的键盘代码,字符集或语法
    2 键盘定义文件坏或未找到
    4 键盘、监视器通讯时出错
    5 要求的字符集未准备好

    move
    0 成功地移动了指定的文件
    1 发生了错误

    msav /N
    86 检查到了病毒

    replace
    0 REPLACE成功地替换或加入了文件
    1 MS-DOS版本和REPLACE不兼容
    2 REPLACE找不到源文件
    3 REPLACE找不到源路径或目标路径
    5 不能存取要替换的文件
    8 内存不够无法执行REPLACE
    11 命令行句法错误

    restore
    0 RESTORE成功地恢复了文件
    1 RESTORE找不到要恢复的文件
    3 用户按CTRL+C终止恢复过程
    4 RESTORE因错误而终止

    scandisk
    0 ScanDisk在它检查的驱动器上未检测到任何错误
    1 由于命令行的语法不对,不能运行ScanDisk
    2 由于内存用尽或发生内部错误,ScanDisk意外终止
    3 用户让ScanDisk中途退出
    4 进行盘面扫描时,用户决定提前退出
    254 ScanDisk找到磁盘故障并已全部校正
    255 ScanDisk找到磁盘故障,但未能全部校正

    setver
    0 SETVER成功地完成了任务
    1 用户指定了一个无效的命令开关
    2 用户指定了一个非法的文件名
    3 没有足够的系统内存来运行命令
    4 用户指定了一个非法的版本号格式
    5 SETVER在版本表中未找到指定的项
    6 SETVER未找到SETVER.EXE文件
    7 用户指定了一个非法的驱动器
    8 用户指定了太多的命令行参数
    9 SETVER检测到丢失了命令行参数
    10 在读SETVER.EXE文件时,SETVER检测到发生错误
    11 SETVER.EXE文件损坏
    12 指定的SETVER.EXE文件不支持版本表
    13 版本表中没有足够的空间存放新的项
    14 在写SETVER.EXE文件时SETVER检测到发生错误

    10、for 命令
    for 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。
    在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable

    for { %variable|%%variable } in (set) do command [ CommandLineOptions]
    %variable 指定一个单一字母可替换的参数。
    (set) 指定一个或一组文件。可以使用通配符。
    command 指定对每个文件执行的命令。
    command-parameters 为特定命令指定参数或命令行开关。
    在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable而不要用 %variable。
    变量名称是区分大小写的,所以 %i 不同于 %I。

    Sample:
    建立C:\TEST1.BAT,文件内容如下:
    @ECHO OFF
    FOR %%C IN (*.BAT *.TXT *.SYS) DO TYPE %%C
    运行:
    C:\>TEST1
    执行以后,屏幕上会将C:盘根目录下所有以BAT、TXT、SYS为扩展名的文件内容显示出来(不包括隐藏文件)。

    11、比较运算符
        EQU - 等于   (一般使用“==”)
        NEQ - 不等于 (没有 “!=”,改用“ if not 1==1 ”的写法)
        LSS - 小于
        LEQ - 小于或等于
        GTR - 大于
        GEQ - 大于或等于


    三、如何使用组合命令(Compound Command)

    1、&
    Usage:第一条命令 & 第二条命令 [& 第三条命令...]
    用这种方法可以同时执行多条命令,而不管命令是否执行成功
    Sample:
    C://>dir z: & dir c://Ex4rch
    The system cannot find the path specified.
    Volume in drive C has no label.
    Volume Serial Number is 0078-59FB
    Directory of c://Ex4rch
    2002-05-14 23:51 <DIR> .
    2002-05-14 23:51 <DIR> ..
    2002-05-14 23:51 14 sometips.gif

    2、&&
    Usage:第一条命令 && 第二条命令 [&& 第三条命令...]
    用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令;
    Sample:
    C://>dir z: && dir c://Ex4rch
    The system cannot find the path specified.
    C://>dir c://Ex4rch && dir z:
    Volume in drive C has no label.
    Volume Serial Number is 0078-59FB
    Directory of c://Ex4rch
    2002-05-14 23:55 <DIR> .
    2002-05-14 23:55 <DIR> ..
    2002-05-14 23:55 14 sometips.gif
    1 File(s) 14 bytes
    2 Dir(s) 768,671,744 bytes free
    The system cannot find the path specified.

    在做备份的时候可能会用到这种命令会比较简单,如:
    dir file://192.168.0.1/database/backup.mdb && copy file://192.168.0.1/database/backup.mdb E://backup
    如果远程服务器上存在backup.mdb文件,就执行copy命令,若不存在该文件则不执行copy命令,这种用法可以替换IF exist了。

    3、||
    Usage:第一条命令 || 第二条命令 [|| 第三条命令...]
    用这种方法可以同时执行多条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;
    Sample:
    C://Ex4rch>dir sometips.gif || del sometips.gif
    Volume in drive C has no label.
    Volume Serial Number is 0078-59FB
    Directory of C://Ex4rch
    2002-05-14 23:55 14 sometips.gif
    1 File(s) 14 bytes
    0 Dir(s) 768,696,320 bytes free

    组合命令使用的例子:
    sample:
    @copy trojan.exe ////%1//admin$//system32 && if not errorlevel 1 echo IP %1 USER %2 PASS %3 >>victim.txt

    四、管道命令的使用

    1、| 命令
    Usage:第一条命令 | 第二条命令 [| 第三条命令...]
    将第一条命令的结果作为第二条命令的参数来使用,记得在unix中这种方式很常见。
    sample:
    time /t>>D://IP.log
    netstat -n -p tcp|find ":3389">>D://IP.log
    start Explorer
    看出来了么?用于终端服务允许我们为用户自定义起始的程序,来实现让用户运行下面这个bat,以获得登录用户的IP。

    2、>、>>输出重定向命令
    将一条命令或某个程序输出结果的重定向到特定文件中, > 与 >>的区别在于,>会清除调原有文件中的内容后写入指定文件,而>>只会追加内容到指定文件中,而不会改动其中的内容。
    sample1:
    echo hello world>c://hello.txt (stupid example?)
    sample2:
    时下DLL木马盛行,我们知道system32是个捉迷藏的好地方,许多木马都削尖了脑袋往那里钻,DLL马也不例外,针对这一点我们可以在安装好系统和必要的应用程序后,对该目录下的EXE和DLL文件作一个记录:
    运行CMD--转换目录到system32--dir *.exe>exeback.txt & dir *.dll>dllback.txt,
    这样所有的EXE和DLL文件的名称都被分别记录到exeback.txt和dllback.txt中,
    日后如发现异常但用传统的方法查不出问题时,则要考虑是不是系统中已经潜入DLL木马了.
    这时我们用同样的命令将system32下的EXE和DLL文件记录到另外的exeback1.txt和dllback1.txt中,然后运行:
    CMD--fc exeback.txt exeback1.txt>diff.txt & fc dllback.txt dllback1.txt>diff.txt.(用FC命令比较前后两次的DLL和EXE文件,并将结果输入到diff.txt中),这样我们就能发现一些多出来的DLL和EXE文件,然后通过查看创建时间、版本、是否经过压缩等就能够比较容易地判断出是不是已经被DLL木马光顾了。没有是最好,如果有的话也不要直接DEL掉,先用regsvr32 /u trojan.dll将后门DLL文件注销掉,再把它移到回收站里,若系统没有异常反映再将之彻底删除或者提交给杀毒软件公司。

    3、< 、>& 、<&
    < 从文件中而不是从键盘中读入命令输入。
    >& 将一个句柄的输出写入到另一个句柄的输入中。
    <& 从一个句柄读取输入并将其写入到另一个句柄输出中。
    这些并不常用,也就不多做介绍。

    五、注册表操作

    1、备份注册表,将[HKEY_LOCAL_MACHINE ... Run]的内容,备份到“c:\windows\1.reg”

    reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run c:\windows\1.reg
    reg export HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run c:\windows\2.reg


    2、修改/添加注册表内容

    a.一般的添加或修改

    reg add "HKCU\Environment" /v Java_Home /t reg_sz /d "D:\Java\jdk1.6.0_07" /f

    上句解析:“HKCU”是“HKEY_CURRENT_USER”的缩写,不用缩写用全称也可以;
    添加名称为“Java_Home”的变量;类型为“reg_sz”,另一种常见类型是“reg_dword”;值为 D:\Java\jdk1.6.0_07;

    b.使用变量

    set SoftWareHome=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java
    reg add "%SoftWareHome%Web Start\1.6.0_07" /v Home /t reg_sz /d "%cd%\jre1.6.0_07\bin" /f

    c.如果注册表的名称有空格,或者数据用特殊符号时

    reg add "%SoftWareHome2%\HelpCommands" /v "01:Online Documentation" /t reg_sz /d "\"%cd%\Documentation\Index.htm\"" /f
    传入值为(值用双引号括起来的):"D:\ProgramFiles\1.work_soft\Sybase\PowerDesigner_12\Documentation\Index.htm"
    reg add "%SoftWareHome2%\Paths" /v ReportTemplates /t reg_sz /d "%cd%\Resource Files\Report Templates\\" /f
    传入值为(“\”结尾的): E:\Holemar\1.notes\90. Windows\Resource Files\Report Templates\

    d.增加空的内容

    reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg\IMJPMIG8.1"

    e.添加或修改默认值

    reg add "%vpath%InstallPath" /ve /t reg_sz /d "%cd%" /f

    这里用“/ve”来代替一般修改时的“/v 变量名”,即可修改默认值了


    3、删除注册表的内容

    双引号里面的是注册表的目录,下面两句将删除这目录下的所有信息

    reg delete "HKEY_CURRENT_USER\Software\RealVNC" /f
    reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\RealVNC" /f

    双引号里面的是注册表的目录,下面一句将删除这目录下指定的某个信息

    reg delete "HKEY_LOCAL_MACHINE\Software\RealVNC" /v VNC_Server /f


    4、注册表的常用位置

    a.系统启动项:

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]

    example:

    REG ADD HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run /v VNC_Server /t REG_SZ /d "%cd%\VNC_Server.bat" /f

    b.系统环境变量:

    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]

    c.当前用户的环境变量:

    [HKEY_CURRENT_USER\Environment]


    5、修改注册表之后,结束并重新加载explorer.exe进程,可刷新注册表,令其生效

    taskkill /f /im explorer.exe >nul
    start "" "explorer.exe"

    六、系统服务

    1、启停服务

    停止服务:NET STOP 服务名
    启动服务:NET Start 服务名

    2、设置启动类型

    自动:  SC CONFIG 服务名 START= auto
    手动:  SC CONFIG 服务名 START= demand
    已禁用:SC CONFIG 服务名 START= disabled
    附:“START= ”等号后面必须要有一个空格。(start还有boot,system两个值)
    Sample: 

    SC CONFIG Spooler START= demand (打印机加载项,设置成手动,默认自动)

    3、查看系统服务

    start %SystemRoot%\system32\services.msc /s

    七、其他命令

    1、ping 命令

    测试网络联接状况以及信息包发送和接收状况,但是不能够测试端口。
    语法:ping IP地址或主机名 [-t] [-a] [-n count] [-l size]
    参数含义:
      -t 不停地向目标主机发送数据;
      -a 以IP地址格式来显示目标主机的网络地址;
      -n count 指定要Ping多少次,具体次数由count来指定;
      -l size 指定发送到目标主机的数据包的大小。

    Sample: ping 192.168.0.1 -t (不停的测试192.168.0.1,按ctrl+c停止)
    Sample: for /L %%a in (0,1,255) do ping 192.168.0.%%a -n 1 >> tmp.txt (ping一下所有的局域网电脑)

    2、telnet 命令
    测试端口使用 telnet IP地址或主机名端口,使用tcp协议

    Sample:  telnet 192.168.0.1 80 (测试192.168.0.1的80端口)

    3、color 命令

    设置背景及字体颜色
    语法: color bf
    b 是指定背景色的十六进制数字; f 指定前景颜色(即字体颜色)。
    颜色值:     0:黑色    1:蓝色    2:绿色    3:湖蓝    4:红色    5:紫色    6:黄色    7:白色
                  8:灰色    9:淡蓝    A:淡绿    B:浅绿    C:淡红    D:淡紫    E:淡黄    F:亮白
    如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时的颜色。
    如果两参数一样,视为无效输入。只有一个参数时,设置字体。

    4、random 命令

    产生随机数(正整数0~)

    5、exit 命令

    结束程序。即时是被调用的程序,结束后也不会返回原程序

    6、shutdown命令

    shutdown -s 关机

    7、 所有内置命令的帮助信息

    ver /?
    cmd /?
    set /?
    rem /?
    if /?
    echo /?
    goto /?
    for /?
    shift /?
    call /?

    其他需要的常用命令

    type /?
    find /?
    findstr /?
    copy /?

    ---------------------------------------------------------------------------------------------------------------------------------------------

    自己工作中,经常要同步几个目录下的文件或目录,所以自己看了下批处理语法,写了个下面的bat:

    :: 覆盖目录或单个文件
    
    @rem 关闭显示"输出命令"
    @echo off
    
    :: 定义全局变量
    :: 源文件/目录相对路径(如果是文件夹,末尾要加\)
    set FILE_NAME=application\modules\all\views\interfaceJS_tiny.phtml
    :: 源文件/目录绝对路径
    set SOU_PATH=E:\ProjectFile\work\ousucms\trunk\%FILE_NAME%
    :: 目标文件/目录绝对路径
    set DES_PATH=E:\ProjectFile\work
    set DES_CMS=%DES_PATH%\ousucms\trunk\%FILE_NAME%
    set DES_OA=%DES_PATH%\ousuoa\trunk\%FILE_NAME%::goto :end
    
    :: CMS
    if "%DES_CMS%"=="" goto :skip
    if "%DES_CMS%" NEQ "%SOU_PATH%" (
        if exist %DES_CMS% (
            (pushd %DES_CMS% 2>nul) || (goto :isfile)
            echo 开始删除目录 "DES_CMS":
            rmdir %DES_CMS% /s /q
            if "%errorlevel%" == "0" (echo 删除成功) else (echo 删除失败)
            echo 开始复制目录 "%SOU_PATH%" 到 "%DES_CMS%":
            xcopy %SOU_PATH%* %DES_CMS% /e /h /d /y
            popd
            goto :skip
        )
    )
    :isfile
    copy %SOU_PATH% %DES_CMS% /y
    :skip
    
    :: OA
    if "%DES_OA%"=="" goto :skip
    if "%DES_OA%" NEQ "%SOU_PATH%" (
        if exist %DES_OA% (
            (pushd %DES_OA% 2>nul) || (goto :isfile)
            echo 开始删除目录 "DES_OA":
            rmdir %DES_OA% /s /q
            if "%errorlevel%" == "0" (echo 删除成功) else (echo 删除失败)
            echo 开始复制目录 "%SOU_PATH%" 到 "%DES_OA%":
            xcopy %SOU_PATH%* %DES_OA% /e /h /d /y
            popd
            goto :skip
        )
    )
    :isfile
    copy %SOU_PATH% %DES_OA% /y
    :skip
    
    :end
    pause

    参考:http://www.cnitblog.com/martin/archive/2006/04/21/9461.html
            http://hi.baidu.com/i7ever/item/6dc4e64b7f3ddf0d6cc2f0cf
            http://www.cnblogs.com/SunShineYPH/archive/2011/12/13/2285570.html

  • 相关阅读:
    mac c++编译出现segmentation fault :11错误
    ssh 连接缓慢解决方法
    237. Delete Node in a Linked List
    203. Remove Linked List Elements
    Inversion of Control Containers and the Dependency Injection pattern
    82. Remove Duplicates from Sorted List II
    83. Remove Duplicates from Sorted List
    SxsTrace
    使用CCleaner卸载chrome
    decimal and double ToString problem
  • 原文地址:https://www.cnblogs.com/adforce/p/2842893.html
Copyright © 2011-2022 走看看