• 批处理中的变量和参数(二)


    -----siwuxie095

       

       

       

    二、自定义变量

       

    一般用 set 读入的方法定义和赋值

       

    1、程序里设置变量

    set var=Hello World!

    echo %var%

    pause>nul

       

    sublime中:

       

       

       

    2、读入的方法设置变量

    set /p var=请输入一个变量:

    echo %var%

    pause >nul

       

    sublime中:

       

       

       

       

       

       

    提到变量就不能不提批处理中的两个符号:% !

       

    批处理中,对变量不用像C语言一样预先定义就可以使用,非常自由

    看似自由的机制,却又让人又痛苦:在没有预先说明哪些符号是变量

    的情况下,计算机的识别问题。

       

    解决方案:在编程时,对要使用的变量用 % 标明,在延迟变量的情况下

    ! 标明

       

    如:常规情况下

    @echo off

    set num=12

    echo %num%

    pause

       

    如:延迟变量情况下

    @echo off

    setlocal enabledelayedexpansion

    set num=12

    for /l %%i in (1,1,5) do (

    set /a num+=10

    echo !num!

    )

    pause

       

    这两个例子就是关于常规情况下变量符号 %延迟变量情况下变量符号

    的使用,其功能在于告诉计算机该串代码是变量

       

       

    %0 - %9 %* 十一个符号中的 % 不是代表变量,而是参数的意思,

    参数和普通变量不同,不能改变参数的值

       

    for 里的 %%i,两个 % 标出的不是普通变量,而是循环变量,

    循环变量和普通变量不同,不能改变循环变量的值

       

    for 里的循环变量 %%i 和 参数 %0 - %9,其整体代表变量,引用时

    不能再对其增加变量符号 % !

       

       

    在计算中,% 表示取余,如:

    @echo off

    set num=100

    set /a result=num%%7

    echo %result%

    pause

       

    在输出格式中,% 表示输出格式的意思 %str:~m,n%,详见 set 命令

       

       

    总结:% 应用范围:变量、参数、循环变量、余数计算、格式

       

       

       

       

       

       

    系统参数

    %0%1%2%3%4%5%6%7%8%9%*

       

       

    对于 %1 - %9

    %1 批处理的第一个参数

    %2 批处理的第二个参数

    %3 批处理的第三个参数

    %4 批处理的第四个参数

    %5 批处理的第五个参数

    %6 批处理的第六个参数

    %7 批处理的第七个参数

    %8 批处理的第八个参数

    %9 批处理的第九个参数

       

    批处理有且仅有这九个参数,不存在 %10 及以上参数

       

       

    因为 call 命令允许使用参数,先看参数在 call 中的应用:

    @echo off

    call :loop Hello World!

    pause>nul & goto :eof

    :loop

    echo %1

    echo %2

     

    sublime中:

       

       

    运行一览:

       

       

       

    计算机认为 Hello World! 是两个参数,如果想让其是一个参数,

    应该用双引号(英文格式)引起来

       

       

    再如:用 call 带参数递归算阶乘

    @echo off

    title 阶乘--递归算法

    echo. & echo. & echo 阶乘--递归算法

    setlocal enabledelayedexpansion

    echo. & echo.

    set /p n=请输入一个数

    set result=1

    if !n!==0 (echo 结果等于 1 & pause>nul & goto eof) else (call :loop !n!)

    echo. & echo 结果等于!result!

    pause>nul

    :loop

    if not %1==1 (

    set /a result=!result!*%1

    set /a x=%1

    set /a x-=1

    call :loop !x!

    )

       

    sublime中:

       

       

    运行一览:

       

     

       

       

    参数也不止用在 call上,其他例子:

    同一个目录下,有两个bat文件:

    123.bat:

    @echo off

    start abc.bat 1,2,3,4

    call abc.bat a b c d

    pause

       

    abc.bat:

    @echo off

    echo %1

    echo %2

    echo %3

    echo %4

    pasue>nul

       

       

    运行 abc.bat 一览:

       

       

       

    运行 123.bat 一览:弹出两个窗口

       

       

       

       

    可见:赋予参数时,参数和参数之间用逗号 空格隔开都可以

       

       

       

    如:F盘根目录下有一个 test.bat

    @echo off

    format %1

       

       

    在cmd窗口中执行:

       

       

       

    在执行 test.bat 时,%1 就表示 z:,这样 format %1 就相当于

    format z:,即格式化 Z盘

       

    但此程序明显用 set 读入更简单:

    @echo off

    set /p a=请输入一个驱动器号:

    format %a%

    pause>nul

       

    运行一览:

       

       

       

    双击执行 test.bat,输入 z:,若存在 Z盘,就会格式化 Z盘

    (显然 这里 set 比 %1 - %9 简单)

       

       

       

       

    再如:F盘根目录下有 test.bat,a.txt,b.txt:

    @echo off

    type %1

    type %2

       

    在cmd窗口中执行:将顺序显示 a.txt,b.txt 中的内容

       

       

       

       

    很明显:同样可以不用 %1 - %9 就能实现显示文本文件

       

       

    再看:删除文件和文件夹

    del /f /q %1

    rd /q /s %1

       

       

    在cmd中执行时,像上面一样直接赋予要删除的文件(夹)的名字当

    参数即可,实际上可以更简单,直接拖放某文件(夹)到这个 bat 文

    件上面,即可彻底删除

       

    之所以用了两个命令 del 和 rd ,是为了保证可以删除文件以及文件夹,

    加上参数,是为了删除前不必经过确认就删除

       

       

       

    %* 的作用不是很大,只是返回参数,不过它是一次返回全部参数的值,

    不用输入 %0 - %9 来一个个确定

       

    如:

    @echo off

    echo %*

       

    在cmd窗口中执行:空格也一起输出了

       

       

       

       

       

    参数最多只能有九个,测试程序如下:

    @echo off

    echo %1

    echo %10

    echo %11

    pause>nul

       

    sublime中:

       

       

    在cmd窗口中执行:

       

       

       

    咋一看,参数在10及以上似乎可以,其实不然,变换测试:

       

       

    显然,%10 及以上是无效参数,但如果不指定返回参数,用 %*

    输出全部参数,参数个数就没有限制了

       

       

       

    %0 不是返回参数,其有两层意思:

    第一层:如果 %0 前有 echo 等命令,则代表返回该批处理所在的绝对路径

    第二层:如果 %0 前没有任何参数,则代表自身批处理,会无限循环执行

    bat(也就是调用自身 bat 程序)

       

    如:

    @echo off

    echo %0

    pause

       

    运行一览:

       

       

       

    此显示结果带双引号,如果不想要双引号,这么写:

    @echo off

    for %%i in (%0) do echo %%~i

    pause

       

    运行一览:

       

       

       

    再如:无限循环执行 net user,即不断显示用户账户信息,

    直到你手动停止为止(Ctrl+C)

    @echo off

    net user

    %0

       

    运行一览:

       

       

       

    再如:将自身复制到 D盘,并命名为 testx.bat

    @echo off

    echo Hello World!

    copy %0 d: estx.txt

       

    运行一览:

       

       

       

       

       

       

       

    %0 高级用法:

       

    1、最简单的死循环程序,同时也是最简单的批处理程序:

    %0

       

    运行一览:不断重复显示自身路径,直到手动停止(Ctrl+C)

       

       

       

    2、用 %0 实现嵌套和递归

       

    不仅是 call 调用函数的时候可以使用参数,%0 同样可以

    如:

    @echo off

    set /a var=%1+1

    echo %var%

    if %var% lss 100 (%0 %var%) else pause

       

    sublime中:

       

       

    运行一览:从 1 显示到 100

       

       

       

       

    如果用 call,就变成:

    @echo off

    :loop

    set /a var=%1+1

    echo %var%

    if %var% lss 100 call :loop %var%

    pause

       

    sublime中:

       

       

       

    效果一样

       

       

    【made by siwuxie095】

  • 相关阅读:
    转载:混淆包含SlidingMenu、gson等Android代码的proguard写法
    今天解决的两个问题
    C++中指针和引用的区别
    负载均衡服务器session共享的解决方案 (转载)
    Entity Framework的默认值BUG解决方法
    【转】SAPI中的IspeechRecoContext(接口)
    Sapi 添加语法的文章(转载)
    SAPI训练文件存储位置
    Flask第九篇 Flask 中的蓝图(BluePrint)
    Flask 第八篇 实例化Flask的参数 及 对app的配置
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6358173.html
Copyright © 2020-2023  润新知