zoukankan      html  css  js  c++  java
  • 批处理脚本中变量--获取文档中的字段

    在执行python脚本时,需要不断地输入参数来测试实验代码,甚是繁琐(尤其是在给别人演示代码的时候)。想着是不是可以设计一个自动化一键执行的脚本

    bat执行python文件:

    1.  
      @echo off
    2.  
      ::set INTERVAL = 10
    3.  
      ::timeout %INTERVAL%
    4.  
      ::Again
    5.  
       
    6.  
      echo local_cap
    7.  
      C:
    8.  
      cd %~dp0
    9.  
      start pythonw local_cap.py
    10.  
      rem 使用ping命令暂停3s,这样可以看到调用python后的结果
    11.  
      ::ping -n 10 127.0.0.1 > nul

    %0             代指批处理文件自身
    %~d0        是指批处理所在的盘符
    %~dp0      是盘符加路径

    cd %~dp0 就是进入批处理所在目录了

    python.exe与pythonw.exe
    pyhton安装目录下有一个”pythonw.exe” 
    来简单说说”pythonw.exe”和”python.exe”的区別:

    1)”pythonw.exe”执行时不会出现dos窗口 
    2)”pythonw.exe”执行时所有stdin和stdout都无效 
    3)”pythonw.exe”执行时从原有的sdtin只会得到EOF
     

    也可以参照:https://blog.csdn.net/chang995196962/article/details/84578688

    批处理 bat变量重新赋值

    @echo off call Signature.exe "C:Test.dll" SETLOCAL ENABLEDELAYEDEXPANSION set "nResult=" if %errorlevel% == 1024 ( set "nResult=1024" ) else ( set "nResult=2048" ) @echo %nResult% pause

    变量要加双引号就解决了问题

    调用SETLOCAL命令,使变量限制在局部访问范围,以调用ENDLOCAL为结束边界,即SETLOCAL和ENDLOCAL之间的变量为局部变量。

    @echo off 
    set globalvar=110
    SETLOCAL
    set var=220
    set /A var=%var% + 5
    echo %var%
    echo %globalvar%
    ENDLOCAL
    echo %globalvar%
    echo %var%

    在结束ENDLOCAL之后的var局部变量会被销毁,所以最后一个显示提示关闭状态。

    D:at_test>test.bat
    225
    110
    110
    ECHO 处于关闭状态。

    只有----通过python 文件处理;截取字段的文档,批处理获取文档中的字段

    FOR /f %%c in (Mresult.txt) do set ecNum=%%c  #  从文件中获取字符串变量
    exit %ecNum%

    BAT批处理中的字符串处理详解

    下面对这些功能一一进行讲解。

      1、截取字符串

      截取字符串可以说是字符串处理功能中最常用的一个子功能了,能够实现截取字符串中的特定位置的一个或多个字符。举例说明其基本功能:

     代码如下:


      @echo off
      set ifo=abcdefghijklmnopqrstuvwxyz0123456789
      echo 原字符串(第二行为各字符的序号):
      echo %ifo%
      echo 123456789012345678901234567890123456
      echo 截取前5个字符:
      echo %ifo:~0,5%
      echo 截取最后5个字符:
      echo %ifo:~-5%
      echo 截取第一个到倒数第6个字符:
      echo %ifo:~0,-5%
      echo 从第4个字符开始,截取5个字符:
      echo %ifo:~3,5%
      echo 从倒数第14个字符开始,截取5个字符:
      echo %ifo:~-14,5%
      pause

      当然,上面的例子只是将字符串处理的基本功能展示出来了,还看不出字符串处理具体有什么用处。下面这个例子是对时间进行处理。

     代码如下:


      @echo off
      echo 当前时间是:%time% 即 %time:~0,2%点%time:~3,2%分%time:~6,2%秒%time:~9,2%厘秒
      pause

    2、替换字符串
      替换字符串,即将某一字符串中的特定字符或字符串替换为给定的字符串。举例说明其功能:

     代码如下:


      @echo off
      set aa=伟大的中国!我为你自豪!
      echo 替换前:%aa%
      echo 替换后:%aa:中国=中华人民共和国%
      echo aa = %aa%
      set "aa=%aa:中国=中华人民共和国%"
      echo aa = %aa%
      pause

      对于上面的例子有一点说明,对比两个echo aa = %aa%可以发现,如果要修改变量aa的内容的话,就需要将修改结果“%aa:中国=中华人民共和国%”赋值给变量aa。上面的字符串截取也有着同样的特点。

    3、字符串合并

      其实,合并字符串就是将两个字符串放在一起就可以了。举例说明:

     代码如下:


      @echo off
      set aa=伟大的中国!
      set bb=我为你自豪!
      echo %aa%%bb%
      echo aa=%aa%
      echo bb=%bb%
      set "aa=%aa%%bb%"
      echo aa=%aa%
      pause

      同样,如果要改变变量aa的内容的话,就需要将合并结果“%aa%%bb%”赋值给变量aa。

    4、扩充字符串

      “扩充”这个词汇来自于微软自己的翻译,意思就是对表示文件路径的字符串进行特殊的处理,具体功能罗列如下:
      =========================================
      ~I - 删除任何引号("),扩充 %I
      %~fI - 将 %I 扩充到一个完全合格的路径名
      %~dI - 仅将 %I 扩充到一个驱动器号
      %~pI - 仅将 %I 扩充到一个路径
      %~nI - 仅将 %I 扩充到一个文件名
      %~xI - 仅将 %I 扩充到一个文件扩展名
      %~sI - 扩充的路径只含有短名
      %~aI - 将 %I 扩充到文件的文件属性
      %~tI - 将 %I 扩充到文件的日期/时间
      %~zI - 将 %I 扩充到文件的大小
      %~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充
      到找到的第一个完全合格的名称。如果环境变量名
      未被定义,或者没有找到文件,此组合键会扩充到
      空字符串
      可以组合修饰符来得到多重结果:
      %~dpI - 仅将 %I 扩充到一个驱动器号和路径
      %~nxI - 仅将 %I 扩充到一个文件名和扩展名
      %~fsI - 仅将 %I 扩充到一个带有短名的完整路径名
      %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
      到找到的第一个驱动器号和路径。
      %~ftzaI - 将 %I 扩充到类似输出线路的 DIR
      =========================================
      以上内容引用于for /?帮助信息。其中的I代表变量I,不过需要说明的是,不是所有的变量都能够进行扩充的,有两个条件:1、该字符串代表一个文件路径;2、变量要用%x来表示,x可取a-z A-Z 0-9共62个字符中的任意一个。举例说明:

     代码如下:


      @echo off
      echo 正在运行的这个批处理:
      echo 完全路径:%0
      echo 去掉引号:%~0
      echo 所在分区:%~d0
      echo 所处路径:%~p0
      echo 文件名:%~n0
      echo 扩展名:%~x0
      echo 文件属性:%~a0
      echo 修改时间:%~t0
      echo 文件大小:%~z0
      pause

      其中的%0是批处理里面的参数,代表当前运行的批处理的完全路径。类似的还有%1-%9,分别代表传递来的第1-9个参数。例子如下:

     代码如下:


      @echo off
      set aa=C:WindowsPPPa.btx
      call :deal aaa %aa% "c c" ddd eee
      pause>nul
      exit
      :deal
      echo %%0 = %0
      echo %%1 = %1
      echo %%2 = %2
      echo %%3 = %3
      echo %%4 = %4
      echo %%5 = %5

      其中,变量aa在之前是不可以扩充的,通过call命令并将aa作为参数传递给子函数:deal,将aa变量转换成了变量%1,即符合%x格式,从而可以进行字符串扩充。
      至于%x中x取a-z A-Z的形式,可以复习一下for语句,for语句里面的变量就是用%x来表示的,因而可以直接进行扩充。

    下面是其它网友的补充:注意是与c语言做了一些对比

    首先说一下,批处理和高级语言不同,没有字符串处理函数,比如strcat之类的,但是却可以利用环境变量来实现这些函数的功能。
    本文对照C语言中的字符串处理函数,讲解在批处理中的实现方法。

    首先说一下字符串的存储,在C语言中,采用字符数组或者字符指针来存储字符串,而BAT中没有这些东东,所以要依靠环境变量来存储。
    设置环境变量的语句为set语句,本文不详细介绍了,参考set /?语句。

    1、C语中的strcpy函数,将一个字符串复制到另一个字符型指针或字符数组,覆盖原来的字符串。

    C语言中的调用方法:strcpy(目标字符串,源字符串)

    在批处理中的实现方法:

    set 目标字符串=%源字符串%

    示例:代码如下:


    @echo off
    ::关闭屏幕回显(可选)
    set str1=This is old string
    ::设置str1中存储的字符串,注意没有双引号,这点与C语言等不同!
    set str2=This is new string
    ::设置str2中存储的字符串
    echo 执行字符串拷贝以前:
    echo str1=%str1%
    echo str2=%str2%
    ::先输出一次原有的字符串
    set str1=%str2%
    ::字符串拷贝
    echo 执行字符串拷贝以后:
    echo str1=%str1%
    echo str2=%str2%
    ::输出执行完字符串拷贝后的字符串
    echo 输出完毕,按任意键退出&&pause>nul&&exit
    ::输出信息,当用户按任意键时,结束该批处理。

    2、C语中的strcat函数,将一个字符串连接到另一个字符型指针或字符数组的末尾。

    C语言中的调用方法:strcat(目标字符串,源字符串)

    在批处理中的实现方法:

    set 目标字符串=%目标字符串%%源字符串%

    示例:

     代码如下:


    @echo off
    set str1=This is string1
    set str2=This is string2
    ::设置str1和str2中存储的字符串
    echo 连接字符串以前:
    echo str1=%str1%
    echo str2=%str2%
    ::先输出一次原有的字符串
    set str1=%str1%%str2%
    ::字符串连接
    echo 连接字符串以后:
    echo str1=%str1%
    echo str2=%str2%
    ::输出执行完字符串连接后的两个字符串
    echo 输出完毕,按任意键退出&&pause>nul&&exit

    3、字符串截取,C中没有这种函数,不过可以通过语句实现,不再介绍,直接说批处理的。

    set 目标字符串=%源字符串:~起始值,截取长度%

    注意,起始值从0开始!
    截取长度是可选的,如果省略逗号和截取长度,将会从起始值一直截取到字符串的结尾。

    示例:

     代码如下:


    @echo off
    set str1=This is string1
    ::设置str1中存储的字符串
    set str2=%str1:~8,6%
    set str3=%str1:~0,4%
    set str4=%str1:~5%
    ::字符串截取
    echo 原字符串:
    echo str1=%str1%
    echo 截取得到的字符串:
    echo str2=%str2%
    echo str3=%str3%
    echo str4=%str4%
    ::输出执行结果
    echo 输出完毕,按任意键退出&&pause>nul&&exit

    4、C语中的strlen函数,取得字符串的长度。

    C语言中的调用方法:strlen(字符串)

    在批处理中的实现方法是利用goto和标签,形成循环结构,不断将字符串截短1字符,并用变量记录截短的次数,直到字符串变成空串。

    示例:

     代码如下:


    @echo off
    set str1=This is a test string
    set str2=Hello World
    ::设置两个字符串
    set str=%str1%
    ::将str1复制到str
    :next1
    ::标签,用于goto跳转
    ::注意与注释语句的区别,注释用两个冒号开头,标签则为一个冒号
    if not "%str%"=="" (
    ::判断str是不是空串,如果不是则执行下边的语句
    set /a num+=1
    ::算术运算,使num的值自增1,相当于num++或者++num语句
    set "str=%str:~1%"
    ::截取字符串,赋给自身
    goto next1
    ::跳转到next1标签
    ::这里利用goto和标签,构成循环结构
    )
    ::当以上循环结构执行完毕时,会执行下边的语句
    echo str1=%str1%
    echo str1的长度为:%num%
    ::输出结果
    set num=0
    ::将记和用的环境变量num置0,以便开始下一次运算。
    set str=%str2%
    ::将str2复制到str
    :next2
    ::定义一个新的标签
    ::注意不能与已有的标签同名,否则会出错!
    if not "%str%"=="" (
    set /a num+=1
    set "str=%str:~1%"
    goto next2
    )
    ::和上一个循环相似,不再介绍
    echo str2=%str2%
    echo str2的长度为:%num%
    ::输出结果
    echo 输出完毕,按任意键退出&&pause>nul&&exit

    5、C语中的strchr函数,在一个字符串中查找一个字符的首次出现位置,找到时返回所在位置,找不到时返回0值。

    批处理中的思路:不断截短字符串,并取截短后字符串中的首字符,和要求的字符比较,如果相同就利用goto语句跳出循环,输出结果,如果没有相同的字符,执行到最后就输出0值。

    示例:

    代码如下:

    @echo off
    Setlocal ENABLEDELAYEDEXPANSION
    ::启用命令扩展,参加setlocal /?命令
    set str1=This is a test string
    set ch1=t
    ::注意,这里是区分大小写的!
    set str=%str1%
    ::复制字符串,用来截短,而不影响源字符串
    :next
    if not "%str%"=="" (
    set /a num+=1
    if "!str:~0,1!"=="%ch1%" goto last
    ::比较首字符是否为要求的字符,如果是则跳出循环
    set "str=%str:~1%"
    goto next
    )
    set /a num=0
    ::没有找到字符时,将num置零
    :last
    echo 字符'%ch1%'在字符串"%str1%"中的首次出现位置为%num%
    echo 输出完毕,按任意键退出&&pause>nul&&exit

    引用:
    最后出几道题,看看大家学习的怎么样!
    (1)如何实现C语言中strstr函数的功能?
    提示:strstr函数的功能是在字符串1中查找字符串2,找到时返回串2首次出现的位置,否则返回0值。与strchr区别就是,第二个参数是字符串,而不是字符了。

    (2)如何用批处理构建while循环?
    提示:while循环一般格式为:
    while(表达式)
    {
    循环体
    [break|continue;]
    循环体
    }
    其中,循环体为0条或多条语句,break用于跳出循环,continue用于直接判断表达式并决定是否进入下一次循环。
    一般执行顺序:首先判断表达式,如果成立则进入循环,循环体执行完毕后再次判断表达式的值,决定是否再次循环。

    (3)如何用批处理构建do-while循环?
    提示:do-while循环一般格式为:
    do
    {
    循环体
    [break|continue;]
    循环体
    }while(表达式);
    各个语句的解释参照while循环。
    一般执行顺序:首先进入循环,循环体执行完毕后判断表达式的值,表达式成立则再次进入循环。

  • 相关阅读:
    轻重搭配
    EF的优缺点
    使用bootstrap-select有时显示“Nothing selected”
    IIS发布 HTTP 错误 500.21
    js添加的元素无法触发click事件
    sql server查看表是否死锁
    sql server把一个库表的某个字段更新到另一张表的相同字段
    SQLSERVER排查CPU占用高的情况
    SQL server中如何按照某一字段中的分割符将记录拆成多条
    LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, and this method cannot be translated into a store expression.
  • 原文地址:https://www.cnblogs.com/klb561/p/13809491.html
Copyright © 2011-2022 走看看