02-CMD_常用批处理内部命令2

十一, pushd 和 popd

 说明:
    pushd path, 将指定路径path 压栈, 然后 切换到指定路径
    popd,   弹栈, 并切换到弹出的路径.

  1, pushd
    概念:
        先保存当前目录以供 POPD 命令使用,再改到指定的目录。
    格式:
        PUSHD [path | ..]
            path        指定要成为当前目录的目录。
  2, popd
    概念:
        更改到 PUSHD 命令存储的目录。
    格式:
        POPD


    举例:
        C:\Windows\System32>cd /d d:\cmd
        d:\cmd>mkdir dir
        d:\cmd>cd dir
        d:\cmd\dir>pushd d:\cmd
        d:\cmd>pushd d:\
        d:\>popd
        d:\cmd>popd        




十二, assoc 和 ftype

    a.txt => txtfile => notepad.exe
    文件     文件类型   执行(解析)程序
    说明:1)双击 "a.txt"文件                     ->.txt;
         2)判断该文件的文件类型                 ->txtfile;
         3)调用执行txtfile类型文件的程序打开a.txt->notepad.exe
  1, assoc
    概念:
        显示或修改文件扩展名关联
    格式:
        ASSOC [.ext[=[fileType]]]
        即: 1) assoc
            2) assoc .ext
            3) assoc .ext=
            4) assoc .ext=fileType
    说明:
        .ext    : ext, extend的前三个字母, 扩展名的意思
        fileType: 该有该扩展名的文件 是什么类型.
    举例:
        d:\cmd>assoc        // 显示所有扩展名 关联的 文件类型

        d:\cmd>assoc .jar   // 显示 ".jar" 结尾的文件 的文件类型
        .jar=jarfile

        d:\cmd>assoc .txt   // 显示 ".txt" 结尾的文件 的文件类型
        .txt=txtfile

        d:\cmd>assoc .jar=  // 删除 ".jar" 结尾的文件 的文件类型

        d:\cmd>assoc .jar   
        没有为扩展名 .jar 找到文件关联

        d:\cmd>assoc .jar=jarfile   // 设置 ".jar"结尾的文件 的文件类型
        .jar=jarfile

        d:\cmd>assoc .jar
        .jar=jarfile        

  2, ftype
    概念:
        显示或修改用在文件扩展名关联中的文件类型.
    格式:
        FTYPE [fileType[=[openCommandString]]]
            fileType  指定要检查或改变的文件类型
            openCommandString 指定调用这类文件时要使用的开放式命令。
    说明:
        1.txt文件的扩展名是 .txt
        .txt 的文件类型 txtfile
        txtfile类型文件用 notepad.exe 打开

        在一个开放式命令字符串之内,
        命令字符串 %0 或 %1 被通过关联调用的文件名所代替。
        %* 得到所有的参数,%2 得到第一个参数,%3 得到第二个,等等。
        %~n 得到其余所有以 nth 参数打头的参数;n 可以是从 2 到 9 的数字。
    举例:
        d:\cmd>ftype txtfile
        txtfile=%SystemRoot%\system32\NOTEPAD.EXE %1

        d:\cmd>notepad 1.txt    // 用notepad打开
        d:\cmd>"E:\EditPlus 3\EditPlus.exe" 1.txt   // 用editplus打开

        d:\cmd>ftype jarfile
        jarfile="D:\Java\jre7\bin\javaw.exe" -jar "%1" %*
    注意:
        这只是设置文件关联, 而不是设置默认打开程序

十三, call

    概念:
        从批处理程序调用另一个批处理程序。
    格式:
        CALL [drive:][path]filename [batch-parameters]
          batch-parameters   指定批处理程序所需的命令行信息。
          调用的其它批处理程序。filename  参数必须具有 .bat 或 .cmd  扩展名。

        如果命令扩展被启用,CALL 会如下改变:
        CALL 命令现在将卷标当作 CALL 的目标接受。语法是:
          CALL:label arguments        
          调用本文件内命令段,相当于子程序。
          被调用的命令段以标签":label" 开头, 以命令"goto :eof" 结尾。
    说明:
         %~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 的输出行。


    举例:
        @echo off

        echo 产生一个临时文件 > temp.txt

        rem 先保存当前目录, 再将 c:\windows 设为当前目录
        pushd c:\windows

        call :sub temp.txt

        rem 恢复目录
        rem popd 
        rem call :sub "temp.txt"

        pause

        del temp.txt

        exit

        :sub
        rem call %0 %1 : 第0个参数,%0 是":sub", 第1个参数,%1 是 temp.txt
        rem echo 原始: %1

        rem 去掉参数的引号
        rem echo 删除引号:  %~1

        rem 当前路径 "c:\windows", 结果-> c:\windows
        rem echo 扩充到路径: %~f1

        rem 当前路径"c:\windows", 结果-> c
        rem echo 扩充到一个驱动器号: %~d1

        rem 当前路径"c:\windows", 结果-> :\windows\
        rem echo 扩充到一个路径(不带盘符): %~p1

        rem 结果-> temp
        rem echo 扩充到一个文件名: %~n1

        rem 结果-> .txt
        rem echo 扩充到一个文件扩展名: %~x1

        rem 结果-> c:\Windows\temp.txt
        rem echo 当前路径+短文件名 %~s1
         
        rem echo 文件属性:%~a1

        rem echo 日期/时间 : %~t1

        rem 结果-> c:\Windows\
        rem echo 扩展到驱动器号和路径 : %~dp1

        rem 结果-> temp.txt
        rem echo 扩展到文件名和扩展名: %~nx1

        rem echo 扩展到类似dir的输出行: %~ftza1

        goto :eof
    举例:
        C:\Windows\System32>cd /d d:\cmd

        d:\cmd>set var=123

        d:\cmd>%var%
        '123' 不是内部或外部命令,也不是可运行的程序
        或批处理文件。

        d:\cmd>set cmdstr=echo %var%

        d:\cmd>%cmdstr%
        123

        d:\cmd>call %cmdstr%
        123

十四, shift

    概念:
        更改批处理文件中可替换参数的位置。
    格式:  
        SHIFT [/n]
    说明:
        如果命令扩展被启用,SHIFT 命令支持/n 命令行开关;该命令行开关告诉
        命令从第 n 个参数开始移位;n 介于零和八之间。例如:
            SHIFT /2
        会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。    
    举例:
        @echo off

        echo =========sub1==========
        call :sub1 var1 var2 var3

        echo =========sub2==========
        call :sub2 var1 var2 var3

        pause

        :sub1
        echo %0
        echo %1
        echo %2
        echo %3
        goto :eof

        :sub2
        echo %1
        shift 
        echo %1
        shift 
        echo %1
        goto :eof

十五, if

格式:
    if [not] errorLevel number commond
    if [not] string1==string2 commond
    if [not] exist filename commond
说明:
    1, if [not] errorLevel number commod
        1) if errorLevel 必须紧跟在一个命令之后
        2) 执行命令后, 由 if errorLevel 来判断命令的返回值
        3) number的 范围为 0~255
        4) 判断时, 值的排列顺序 必须从大到小
        5) 返回值 等于 number 时,成立
        举例:
            @echo off

            dir
            rem dir2

            rem 返回代码为 1, 跳转到 :1 处执行; 返回代码为 2, 跳转到 :2 处执行.
            rem 此处两行 不可交换位置, 否则失败了也显示成功
            if errorLevel 1 goto 1
            if errorLevel 2 goto 2

            :0
            echo 命令执行成功!
            goto exit

            :1
            echo 命令执行失败!
            goto exit

            :exit
            pause


    2, if [not] string1==string2 commond
        1) string1 和 string2 都是字符数据
        2) 区分大小写
        3) 相当 即可执行 commond命令
        4) 防止左右无意出现空格, 可:
            ① if [not] {string1}=={string2} commond
            ② if [not] [string1]==[string2] commond
            ③ if [not] "string1"=="string2" commond
           说明: 这种写法,其实是把"{}","[]"当成了string的一部分.
        举例:
            d:\cmd\01>if a=a echo ok    // 应该写成 "=="
            此时不应有 =a。

            d:\cmd\01>if a==a echo ok
            ok

            d:\cmd\01>if not a==b echo ok
            ok

            d:\cmd\01>if "a"=="a" echo ok
            ok

            d:\cmd\01>if 'a'=='a' echo ok
            ok            
            
    3, if [not] exist filename commond
       概念:
            文件/目录 存在, 则执行 commond
            if [not] exist filename (
                commond1
            ) else (
                commond2
            )
       举例:
        d:\cmd\01>del 1.txt
        找不到 d:\cmd\01\1.txt

        d:\cmd\01>echo 11 > 1.txt

        d:\cmd\01>if exist 1.txt (echo 文件存在!) else echo 文件不存在!!!
        文件存在!

        d:\cmd\01>del 1.txt

        d:\cmd\01>if exist 1.txt (echo 文件存在!) else echo 文件不存在!!!
        文件不存在!!!            
    
        5.bat=>
            if exist 1.bat (
                echo 1.bat 存在
            ) else (
                echo 1.bat 不存在
            )

            if exist ak (
                echo ak 存在
            ) else (
                echo ak 不存在
            )
    4, 如果命令扩展行被启用, if会如下改变:
        1) if [/i] string1 compare-op string2 commond
            /i  : 不区分大小写
            compare-op:
                equ, 等于
                neq, 不等于
                lss, 小于
                leq, 小于或等于
                gtr, 大于
                geq, 大于或等于
        2) if cmdextversion number commond
        3) if defined variable commond
            举例:
                d:\cmd\01>set a=123

                d:\cmd\01>if defined a echo 定义了a
                定义了a    

补充, 命令扩展

    CMD
       /E:ON   启用命令扩展
       /E:OFF  停用命令扩展


    命令扩展是按默认值启用的。
    您也可以使用 /E:OFF,为某一特定调用而停用扩展。
    您可以在机器上和/或用户登录会话上启用或停用 CMD.EXE 所有调用的扩展,
    这要通过设置使用REGEDT32.EXE 的注册表中的一个或两个 REG_DWORD 值:


        HKEY_LOCAL_MACHINE\Software\Microsoft\Command rocessor\EnableExtensions
        和
        HKEY_CURRENT_USER\Software\Microsoft\Command Processor\EnableExtensions


    到 0x1 或 0x0。用户特定设置比机器设置有优先权。
    命令行开关比注册表设置有优先权。


    命令行扩展包括对下列命令所做的更改和/或添加:


        DEL 或 ERASE
        COLOR
        CD 或 CHDIR
        MD 或 MKDIR
        PROMPT
        PUSHD
        POPD
        SET
        SETLOCAL
        ENDLOCAL
        IF
        FOR
        CALL
        SHIFT
        GOTO
        START (同时包括对外部命令调用所做的更改)
        ASSOC
        FTYPE


十六, setLocal 与 变量延迟

1, setLocal
    概念:
        开始批处理文件中环境改动的本地化操作。在执行 SETLOCAL 之后
        所做的环境改动只限于批处理文件。要还原原先的设置,必须执
        行 ENDLOCAL。达到批处理文件结尾时,对于该批处理文件的每个
        尚未执行的 SETLOCAL 命令,都会有一个隐含的 ENDLOCAL 被执行。
2, 变量延迟          
    概念:
    例子 1, 结果: 4
        @echo off
        set a=4
        set a=5 & echo %a%  // 预处理-> set a=5 & echo 4
        pause        
    说明:
        批处理读取命令时是按行读取的(另外例如 for 命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。我们现在分析一下例 1,批处理在运行到这句“set a=5 & echo %a%”之前,先把这一句整句读取并做了预处理——对变量 a 赋了值,那么 %a% 当然就是 4 了!(没有为什么,批处理就是这样做的。)而为了能够感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说“延迟”了对变量的赋值。 
        那么如何开启变量延迟呢?变量延迟又需要注意什么呢?举个例子说明一下: 
        
    例子 2, 结果5
        @echo off
        setLocal enableDelayedExpansion
        set a=4
        set a=5 & echo !a!
        pause    
    说明:
        启动了变量延迟,得到了正确答案。变量延迟的启动语句是“setlocal enabledelayedexpansion ”,并且变量要用一对叹号“!! ”括起来(注意要用英文的叹号),否则就没有变量延迟的效果。分析一下例 2,首先“setlocalenabledelayedexpansion ”开启变量延迟,然后“set a=4 ”先给变量 a 赋值为4,“ set a=5 & echo !a!”这句是给变量 a 赋值为 5 并输出(由于启动了变量延迟,所以批处理能够感知到动态变化,即不是先给该行变量赋值,而是在运行过程中给变量赋值,因此此时 a 的值就是 5 了)。


    例子 3, 交换两变量的值
        @echo off

        set var1=abc
        set var2=123
        echo 交换前: var1=%var1%  var2=%var2%

        set var1=%var2% & set var2=%var1%
        echo 交换后: var1=%var1%  var2=%var2%
        pause       
        
十七, attrib 
    概念:
        显示或更改 文件属性
    格式:
        ATTRIB  [+R | -R] 
                [+A | -A] 
                [+S | -S] 
                [+H | -H] 
                [+I | -I]
                [drive:][path][filename] 
                [/S [/D] [/L]]
    说明:
      + 设置属性。
      - 清除属性。
      R 只读文件属性。
      A 存档文件属性。
      S 系统文件属性。
      H 隐藏文件属性。
      I 无内容索引文件属性。
      [drive:][path][filename]
          指定 attrib 要处理的文件。
      /S 处理当前文件夹及其所有子文件夹中的匹配文件。
      /D 也处理文件夹。
      /L 处理符号链接和符号链接目标的属性。
    例子:
        mkdir autorun 
        attrib +a +s +h autorun 
        建立文件夹 autorun,然后将其设为存档、系统、隐藏属性

你可能感兴趣的:(02-CMD_常用批处理内部命令2)