zoukankan      html  css  js  c++  java
  • 一个脚本文件的解析

    脚本的功能:
    (1)将脚本所在的当前路径名以“”进行分隔
    (2)将分隔后的元素分别入到以a-j区间内10个字母为名的变量中,如果目录没有这么多层次,则相关变量的值为空
    (3)设置相关标志符,为以后拼环境变量CODEDIR 作准备
    (4)如果找到 名为CODEs的文件夹,则将从驱动器到此文件夹的全文件夹名赋给变量CODEDIR,此时if语句结束(后续的if不会再操作CODEDIR变量的值)
    @FOR /F "usebackq tokens=1-10 delims=" %%a in ('%~dp0') do (set a=%%a) @FOR /F "usebackq tokens=1-10 delims=" %%a in ('%~dp0') do (set b=%%b) @FOR /F "usebackq tokens=1-10 delims=" %%a in ('%~dp0') do (set c=%%c) @FOR /F "usebackq tokens=1-10 delims=" %%a in ('%~dp0') do (set d=%%d) @FOR /F "usebackq tokens=1-10 delims=" %%a in ('%~dp0') do (set e=%%e) @FOR /F "usebackq tokens=1-10 delims=" %%a in ('%~dp0') do (set f=%%f) @FOR /F "usebackq tokens=1-10 delims=" %%a in ('%~dp0') do (set g=%%g) @FOR /F "usebackq tokens=1-10 delims=" %%a in ('%~dp0') do (set h=%%h) @FOR /F "usebackq tokens=1-10 delims=" %%a in ('%~dp0') do (set i=%%i) @FOR /F "usebackq tokens=1-10 delims=" %%a in ('%~dp0') do (set j=%%j) @set dirend=false @set CODEDIR=%a% @set v=%b%s if %v% NEQ s (if %dirend%==false (if %v% NEQ CODEs (@set CODEDIR=%CODEDIR%\%b%) else @set dirend=true)) @set v=%c%s if %v% NEQ s (if %dirend%==false (if %v% NEQ CODEs (@set CODEDIR=%CODEDIR%\%c%) else @set dirend=true)) @set v=%d%s if %v% NEQ s (if %dirend%==false (if %v% NEQ CODEs (@set CODEDIR=%CODEDIR%\%d%) else @set dirend=true)) @set v=%e%s if %v% NEQ s (if %dirend%==false (if %v% NEQ CODEs (@set CODEDIR=%CODEDIR%\%e%) else @set dirend=true)) @set v=%f%s if %v% NEQ s (if %dirend%==false (if %v% NEQ CODEs (@set CODEDIR=%CODEDIR%\%f%) else @set dirend=true)) @set v=%g%s if %v% NEQ s (if %dirend%==false (if %v% NEQ CODEs (@set CODEDIR=%CODEDIR%\%g%) else @set dirend=true)) @set v=%h%s if %v% NEQ s (if %dirend%==false (if %v% NEQ CODEs (@set CODEDIR=%CODEDIR%\%h%) else @set dirend=true)) @set v=%i%s if %v% NEQ s (if %dirend%==false (if %v% NEQ CODEs (@set CODEDIR=%CODEDIR%\%i%) else @set dirend=true)) @set v=%j%s if %v% NEQ s (if %dirend%==false (if %v% NEQ CODEs (@set CODEDIR=%CODEDIR%\%j%) else @set dirend=true)) @set CODEDIR=%CODEDIR%CODE @rem @echo %CODEDIR% @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set A=%%A) @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set B=%%B) @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set C=%%C) @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set D=%%D) @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set E=%%E) @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set F=%%F) @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set G=%%G) @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set H=%%H) @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set I=%%I) @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set J=%%J) @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set K=%%K) @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set L=%%L) @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set M=%%M) @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set N=%%N) @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set O=%%O) @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set P=%%P) @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set Q=%%Q) @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set R=%%R) @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set S=%%S) @FOR /F "usebackq tokens=1-10 delims=" %%A in ('%~dp0') do (set T=%%T) @set dirend=false @set v=%B%s if %v% NEQ s (if %dirend%==false (@set PARNAME=%B%)) else @set dirend=true @set v=%C%s if %v% NEQ s (if %dirend%==false (@set PARNAME=%C%)) else @set dirend=true @set v=%D%s if %v% NEQ s (if %dirend%==false (@set PARNAME=%D%)) else @set dirend=true @set v=%E%s if %v% NEQ s (if %dirend%==false (@set PARNAME=%E%)) else @set dirend=true @set v=%F%s if %v% NEQ s (if %dirend%==false (@set PARNAME=%F%)) else @set dirend=true @set v=%G%s if %v% NEQ s (if %dirend%==false (@set PARNAME=%G%)) else @set dirend=true @set v=%H%s if %v% NEQ s (if %dirend%==false (@set PARNAME=%H%)) else @set dirend=true @set v=%I%s if %v% NEQ s (if %dirend%==false (@set PARNAME=%I%)) else @set dirend=true @set v=%J%s if %v% NEQ s (if %dirend%==false (@set PARNAME=%J%)) else @set dirend=true @set v=%K%s if %v% NEQ s (if %dirend%==false (@set PARNAME=%K%)) else @set dirend=true @set v=%L%s if %v% NEQ s (if %dirend%==false (@set PARNAME=%L%)) else @set dirend=true @set v=%M%s if %v% NEQ s (if %dirend%==false (@set PARNAME=%M%)) else @set dirend=true @set v=%N%s if %v% NEQ s (if %dirend%==false (@set PARNAME=%N%)) else @set dirend=true @set v=%O%s if %v% NEQ s (if %dirend%==false (@set PARNAME=%O%)) else @set dirend=true @set v=%P%s if %v% NEQ s (if %dirend%==false (@set PARNAME=%P%)) else @set dirend=true @set v=%Q%s if %v% NEQ s (if %dirend%==false (@set PARNAME=%Q%)) else @set dirend=true @set v=%R%s if %v% NEQ s (if %dirend%==false (@set PARNAME=%R%)) else @set dirend=true @set v=%S%s if %v% NEQ s (if %dirend%==false (@set PARNAME=%S%)) else @set dirend=true @set v=%T%s if %v% NEQ s (if %dirend%==false (@set PARNAME=%T%)) else @set dirend=true @rem @echo %PARNAME%

    相关要点解析:
    1、@ 命令 
    表示不显示@后面的命令。

    http://www.cnblogs.com/SunShineYPH/archive/2011/12/13/2285570.html

    示例:

    echo %~dp0 
    @echo %~dp0 
    echo please wait a minite...
    @echo 1please wait a minite...

    2、%~dp0
    cd /d %~dp0的意思就是cd /d d:qq
    %0代表批处理本身 a.bat
    ~dp是变量扩充
    d既是扩充到分区号 d:
    p就是扩充到路径 qq
    dp就是扩充到分区号路径 d:qq

    %0 determins where the batch file is running from. I've created a demo batch file in my winnt system32 folder called x.cmd. Running this gives the results shown below
    http://www.cnblogs.com/taoxu0903/archive/2010/03/02/1676690.html

    3、for

    (1).没有任何参数的for
    格式为:for %%i in (set) do command
    %%i 为变量
    set为一个文件或者一组文件,其实就是一个集合。可用通配符,比如*.txt。
    command 是要执行的命令。
    
    
    看个例子: 当前目录中有如下文件: a.txt b.mp3 c.mp3 c.wma a.rm e.bat
    
    你想显示里面的扩展名为mp3的文件,你会用什么命令呢?当然是dir了,dir *.mp3。 
    同样的,for也可以来实现,如下: for %%i in (*.mp3) do echo %%i 这如何理解?
     for会先从括号里面执行,因为括号里面是*.mp3,所以for会先得到当前目录下所有的扩展名是mp3的文件,并把它们作为一个集合,而每个文件名就是一个元素,
    像这样{b.mp3,c.mp3},然后用%%i依次代替每个元素,之后做do后面的命令。 当然,()里面不局限于一个文件或者通配符,可以有多个,比如: for %%i in (*.mp3,*.wma) do echo %%i 也是可以的。 注意:do 后面可以跟任何命令,不要局限于echo,这里只是演示。
    (2). 含有/L的for
    格式为:for /L %%i in (start,step,end) do command
    这个表示以增量形式从start到end的一个数字序列,步长是step,就是每次的增量是step
    比如:(1,1,5) 将产生序列 1 2 3 4 5,(1,2,9) 将产生1 3 5 7 9序列。
    这有什么用呢?
    举个例子,你想同时打开3个记事本程序,可以这样:
    for /L %%i in (1,1,3) do notpad.exe
    (3).含有/F的for
    格式:
    FOR /F ["options"] %%i IN (file) DO command
    FOR /F ["options"] %%i IN ("string") DO command
    FOR /F ["options"] %%i IN ('command') DO command
    这个可能是最常用的,也是最强的命令,主要用来处理文件和一些命令的输出结果。
    file代表一个或多个文件
    string 代表字符串
    command代表命令
    ["options"] 可选
    对于FOR /F %%i IN (file) DO command
    
    file为文件名,按照官方的说法是,for会依次将file中的文件打开,并且在进行到下一个文件之前将每个文件读取到内存,按照每一行分成一个一个的元素,忽略空白的行,看个例子。
    
    假如文件a.txt中有如下内容:
    第1行第1列
    第2行第1列
    第3行第1列
    
    你想显示a.txt中的内容,会用什么命令呢?当然是type,type a.txt
    for也可以完成同样的命令:
    for /f %%i in (a.txt) do echo %%i
    通过上面的学习,我们发现for /f会默认以每一行来作为一个元素,但是如果我们还想把每一行再分解更小的内容,该怎么办呢?
    不用担心,for命令还为我们提供了更详细的参数,使我们将每一行分为更小的元素成为可能。 它们就是:delims和tokens delims 用来告诉for每一行应该拿什么作为分隔符,默认的分隔符是空格和tab键 比如,还是上面的文件,我们执行下面的命令:
    for /f "delims= " %%i in (a.txt) do echo %%i 显示的结果是: 第1行第1列 第2行第1列 第3行第1列 为什么是这样的呢。因为这里有了delims这个参数,=后面有一个空格,意思是再将每个元素以空格分割,默认是只取分割之后的第一个元素。
    但是这样还是有局限的,如果我们想要每一行的第二列元素,那又如何呢?
    这时候,tokens跳出来说,我能做到。
    它的作用就是当你通过delims将每一行分为更小的元素时,由它来控制要取哪一个或哪几个。
    还是上面的例子,执行如下命令:
    for /f "tokens=2 delims= " %%i in (a.txt) do echo %%i
    
    执行结果:
    
    第1行第2列
    第2行第2列
    第3行第2列
    
    如果要显示第三列,那就换成tokens=3。
    
    同时tokens支持通配符*,以及限定范围。
    
    如果要显示第二列和第三列,则换成tokens=2,3或tokens=2-3,如果还有更多的则为:tokens=2-10之类的。
    此时的命令为:
    
    for /f "tokens=2,3 delims= " %%i in (a.txt) do echo %%i %%j
    
    怎么多出一个%%j?
    
    这是因为你的tokens后面要取每一行的两列,用%%i来替换第二列,用%%j来替换第三列。
    并且必须是按照英文字母顺序排列的,%%j不能换成%%k,因为i后面是j
    
    执行结果为:
    
    第1行第2列 第1行第3列
    第2行第2列 第2行第3列
    第3行第2列 第3行第3列
    
    对以通配符*,就是把这一行全部或者这一行的剩余部分当作一个元素了。
    
    比如:
    
    for /f "tokens=* delims= " %%i in (a.txt) do echo %%i
    
    执行结果为:
    
    第1行第1列 第1行第2列 第1行第3列
    第2行第1列 第2行第2列 第2行第3列
    第3行第1列 第3行第2列 第3行第3列
    
    其实就跟for /f %%i in (a.txt) do echo %%i的执行结果是一样的。
    再如:
    for /f "tokens=2,* delims= " %%i in (a.txt) do echo %%i %%j
    
    执行结果为:
    
    第1行第2列 第1行第3列
    第2行第2列 第2行第3列
    第3行第2列 第3行第3列
    
    用%%i代替第二列,用%%j代替剩余的所有
    最后还有skip和eol:
    (a)skip就是要忽略文件的前多少行
    (b)eol用来指定当一行以什么符号开始时,就忽略它。 比如:
    for /f "skip=2 tokens=*" %%i in (a.txt) do echo %%i 结果为: 第3行第1列 第3行第2列 第3行第3列 用skip来告诉for跳过前两行。 如果不加tokens=*的话,执行结果为: 第3行第1列 不知道怎么回事。 再如,当a.txt内容变成: .第1行第1列 第1行第2列 第1行第3列 .第2行第1列 第2行第2列 第2行第3列 第3行第1列 第3行第2列 第3行第3列 执行for /f "eol=. tokens=*" %%i in (a.txt) do echo %%i结果是: 第3行第1列 第3行第2列 第3行第3列 用eol来告诉for忽略以“.”开头的行。 同样也必须加tokens=*,否则只会显示“第3行第1列”,还是不知道怎么回事。

    http://www.cnblogs.com/princessd8251/articles/3859021.html

    eg:

    @FOR /F "usebackq tokens=1-10 delims=" %%a in ('%~dp0') do echo %%a
    @FOR /F "usebackq tokens=1-10 delims=" %%a in ('%~dp0') do @echo %%a %%b %%c
    @FOR /F "usebackq tokens=1-10 delims=" %%a in ('%~dp0') do @echo %%b
    
    @FOR /F "usebackq tokens=1-10 delims=" %%a in ('%~dp0') do (set a=%%a)
    @FOR /F "usebackq tokens=1-10 delims=" %%a in ('%~dp0') do (set b=%%b)
    @set CODEDIR=%a%
    @set v=%b%s
    echo %CODEDIR%
    echo %v%
    for /F "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k
    
    这个命令解析 myfile.txt 文件的每一行,忽略以分号开头的行,将第二和第三个令牌从各行传递到 FOR 
    正文(令牌通过逗号或空格分隔)中。FOR 语句的正文引用 %i 以获得第二个令牌,引用 %j 以获得第三个令牌,引用 %k 
    以获得其余全部令牌。如果您提供的文件名包含空格,请使用引号将文本引起来(例如,"File Name")。要使用引号,必须使用 
    usebackq。否则,就将引号解释为定义要解析的文字字符串。
    
    %i 在 FOR 语句中明确声明,并且 %j 和 %k 使用 tokens= 隐含声明。
    只要它不会引起尝试声明高于字母“z”或“Z”的某个变量,则使用 tokens= 可以指定最多 26 个令牌。
    要通过将 filenameset 放在括号之间来解析命令输出,请键入: for /F "usebackq delims==" %i IN (`set`) DO @echo %i
    这个范例列举当前环境中的环境变量名。

    http://www.cnblogs.com/vus520/archive/2013/01/09/2852584.html


    4、if

    这个用法的基本做用是判断上一条命令执行结果的代码,以决定下一个步骤.
    一般上一条命令的执行结果代码只有两结果,"成功"用0表示  "失败"用1表示.
    http://www.cnblogs.com/dongzhiquan/archive/2012/08/16/2643189.html

    rem NEQ比较字符串时区分大小写
    @set b=CODE
    @set dirend=false
    @set CODEDIR=test
    @set v=%b%s
    if %dirend%==false (if %v% NEQ CODEs (@set CODEDIR=%CODEDIR%\%b%) else @set dirend=true)
    echo %CODEDIR%

    其它:

    bat执行,汉字出现乱码:

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

    http://www.cnblogs.com/yank/p/3926643.html









  • 相关阅读:
    codeforces 455B A Lot of Games(博弈,字典树)
    HDU 4825 Xor Sum(二进制的字典树,数组模拟)
    hdu 1800 Flying to the Mars(简单模拟,string,字符串)
    codeforces 425A Sereja and Swaps(模拟,vector,枚举区间)
    codeforces 425B Sereja and Table(状态压缩,也可以数组模拟)
    HDU 4148 Length of S(n)(字符串)
    codeforces 439D Devu and Partitioning of the Array(有深度的模拟)
    浅谈sass
    京东楼层案例思维逻辑分析
    浅谈localStorage和sessionStorage
  • 原文地址:https://www.cnblogs.com/softidea/p/4229829.html
Copyright © 2011-2022 走看看