Batch script in windows(批处理脚本)

Full Batch script in windows(批处理)
chinanetboy 's documnet
批处理(Batch),也称为批处理脚本,
批处理可以灵活又方便的进行电脑或者网络的维护
目录
1.简单批处理命令简介
    echo,rem,pause,call,start,goto,set,if,for,findstr
2.批处理符号简介
    @,<,>>,<,|...
3.常用DOS命令
    

=========================================================================
1.简单批处理命令简介
echo,rem,pause,call,start,goto,set,if,for,find

1.1.echo 命令
  打开回显或关闭请求回显功能,或显示消息.
如果没有任何参数,echo 命令将显示当前回显设置.
语法:
  echo [{on|off}] [message]
  Sample:@echo off / echo hello world
  在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一
  些命令到特定的文件中.
--------------------------------------------------
1.2.rem 命令
在批处理文件或 CONFIG.SYS 里加上注解或说明。
注释命令,类似于在C语言中的/*--------*/,
它并不会被执行,只是起一个注释的作用,便于别人阅读和你自己日后修改.

REM [comment]
Rem Message
Sample:@Rem Here is the description.
--------------------------------------------------
1.3.pause 命令
  暂停命令运行 Pause 命令时,将显示下面的消息:
  Press any key to continue. . .(或:请按任意键继续. . .)
  Sample:
  @echo off
  :begin
  copy G:*.* d:/back
  echo 请插入另一张光盘...
  pause
  goto begin
  在这个例子中,驱动器 G 中磁盘上的所有文件均复制到d:/back中.显示的注释提示您将另一张光盘
  盘放入驱动器 G 时,pause 命令会使程序挂起,以便您更换光盘,然后按任意键继续处理.
--------------------------------------------------
1.4.call 命令
从批处理程序调用另一个批处理程序。
CALL [drive:][path]filename [batch-parameters]
 batch-parameters   指定批处理程序所需要的命令行信
如果命令扩展名被启用,CALL 会如下改变:
CALL 命令现在将卷标当作 CALL 的目标接受。
语法是:  CALL:label arguments
一个新的批文件上下文由指定的参数所创建,控制在卷标被后传递到语句。
您必须通过达到批脚本文件末两次来 "exit第一次读到文件末时,控制会回到 CALL 语句的紧后面。
第会退出批脚本。键入 GOTO /?,参看 GOTO  : EOF  扩展名此描述允许您从一个批脚本返回。

另外,批脚本文本参数参照(%0、%1、等等)已如下改变:
批脚本里的 %* 指出所有的参数(如 %1 %2 %3 %4 %5 批参数(%n)的替代已被增强。
您可以使用以下语法:

         %~1         - 删除引号("),扩充 %1
         %~f1        - 将 %1 扩充到一个完全合格的路
         %~d1       - 仅将 %1 扩充到一个驱动器号
         %~p1       - 仅将 %1 扩充到一个路径
         %~n1       - 仅将 %1 扩充到一个文件名
         %~x1       - 仅将 %1 扩充到一个文件扩展名
         %~s1       - 扩充的路径指含有短名
         %~a1       - 将 %1 扩充到文件属性
         %~t1        - 将 %1 扩充到文件的日期/时间
         %~z1       - 将 %1 扩充到文件的大小
         %~$PATH : 1   - 查找列在 PATH 环境变量的目扩充到找到的第一个完全合格的变量名未被定义,
或者没有找到扩充到空字符串可以组合修定符来取得多重结果:
        %~dp1       - 只将 %1 扩展到驱动器号和路径
        %~nx1       - 只将 %1 扩展到文件名和扩展名
        %~dp$PATH:1 - 在列在 PATH 环境变量中的目录里
                       并扩展到找到的第一个文件的驱
        %~ftza1     - 将 %1 扩展到类似 DIR 的输出行

    在上面的例子中,%1 和 PATH 可以被其它有效数值替%~ 语法被一个有效参数号码终止。
%~ 修定符不能跟    使用

--------------------------------------------------
1.5.start 命令
启动另一个窗口运行指定的程序或命令。

START ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/WAIT] [/B] [command/program]
      [parameters]

    "title"     在窗口标题栏中显示的标题。
    path        起始目录
    B           在不创建新窗口的情况下开始应用程序。 除非启动 ^C 处理,否则该应用程序会忽略 ^C 处理;
                 ^Break 是唯一可以中断该应用程序的方式
    I           新环境是传递给 cmd.exe 的原始环境, 而不是当前环境
    MIN         开始时窗口最小化
    MAX         开始时窗口最大化
    SEPARATE    在分开的空间内开始 16 位 Windows 程序
    SHARED      在分共享的空间内开始 16 位 Windows 程序
    LOW         在 IDLE 优先级类别开始应用程序
    NORMAL      在 NORMAL 优先级类别开始应用程序
    HIGH        在 HIGH 优先级类别开始应用程序
    REALTIME    在 REALTIME 优先级类别开始应用程序
    ABOVENORMAL 在 ABOVENORMAL 优先级类别开始应用程序
    BELOWNORMAL 在 BELOWNORMAL 优先级类别开始应用程序
    WAIT        启动应用程序并等候它结束
    command/program
如果是内部 cmd 命令或批文件,那么该命令处理器是用 /K 命令选项运行 cmd.exe 的。
这表示该窗口在命令运行后仍然存在。
如果不是内部 cmd 命令或批文件,则是一个程序,
并作为窗口应用程序或控制台应用程序运行。
    parameters  这些为传送到命令/程序的参数
如果命令扩展名被启用,通过命令行或 START 命令的外部命令调用会如下改变:
将文件名作为命令键入,非可执行文件    可以通过文件关联调用。。
执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用  程序终止就返回命令提示。
如果在命令脚本内执行,该新行为则不会发生。
如果执行的命令行的第一个符号是不带扩展名或路径修饰符的字符串 "CMD","CMD" 会被COMSPEC 变量的数值所替换。
这防止从当前目录抓出 CMD.EXE。
如果执行的命令行的第一个符号没有扩展名,
CMD.EXE 会使用PATHEXT 环境变量的数值来决定要以什么顺序寻找哪些扩展 名。
PATHEXT 变量的默认值是:    .COM;.EXE;.BAT;.CMD
请注意,该语法跟 PATH 变量的一样,分号隔开不同的元素。
查找可执行文件时,如果没有相配的扩展名,看一看该名称是否与目录名相配。
如果确实如此,START 会在那个路径上调用Explorer。
如果从命令行执行,则等同于对那个路径作 CD /D。

--------------------------------------------------
1.6.goto 命令
将cmd.exe 导向到批处理程序中带标签的行。
GOTO label
:label   指定批处理程序中用作标签的文字字符串。
标签必须单独一行,并且以冒号打头。
如果命令扩展名被启用,GOTO 会如下改变:

  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
  命令就是根据这个:来寻找下一步跳到到那里.最好有一些说明这样你别人看起来才会理解你的意图啊.
=========================================
1.7.set命令
显示/设置/删除变量。
SET [variable=[string]]
  variable  指定环境变量名称。
  string    指定要指派给变量的一系列字符。
仅键入 SET 而不加参数,可以显示当前的环境变量。
如果命令扩展名被启用,SET 会如下改变:
可仅用一个变量激活 SET 命令,等号或值不显示所有前缀匹配
SET 命令已使用的名称的所有变量的值。例如:
SET P
会显示所有以字母 P 打头的变量
如果在当前环境中找不到该变量名称, SET 命令将把 ERRORLEVEL设置成 1。

SET 命令不允许变量名含有等号。
在 SET  命令中添加了两个新替换:
    SET /A expression
    SET /P variable=[promptString]
/A 命令选项指定等号右边的字符串为被评估的数字表达式。
该表达式评估器很简单并以递减的优先权顺序支持下列操作:

    ()                  - 分组
    * / %               - 算数运算符
    + -                 - 算数运算符
    << >>               - 逻辑移位
                       - 按位“与”
    ^                   - 按位“异”
    |                   - 按位“或”
    = *= /= %= += -=    - 赋值
      &= ^= |= <<= >>=
    ,                   - 表达式分隔符

如果您使用任何逻辑或取余操作符, 您需要将表达式字符串用引号扩起来。
在表达式中的任何非数字字符串键作为环境变量名称,
这些环境变量名称的值已在使用前转换成数字
如果指定了一个环境变量名称,但未在当前环境中定义,那么值将被定为零。
这使您可以使用环境变量值做计算而不用键入那些 % 符号来得到它们的值。
如果 SET /A 在命令脚本外的命令行执行的,
那么它显示该表达式的最后值。该分配的操作符在分配的操作符左边需要一个环境变量名称。
除十六进制有 0x 前缀, 八进制有 0 前缀的,数字值为十进位数字。
因此, 0x12 与 18 和 022 相同。
请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,
因为 8 和 9 不是有效的八进制位数。

/P 命令选项允许将变量数值设成用户输入的一行输入。
读取输入行之前,显示指定的 promptString。promptString 可以是空的。

环境变量替换已如下增强:
    %PATH:str1=str2%

会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的
开始到 str1 剩余部分第一次出现的地方,都一直保持相配。

也可以为扩展名指定子字符串。
    %PATH:~10,5%会扩展 PATH 环境变量,
然后只使用在扩展结果中从第 11 个(偏移量 10)字符开始的五个字符。
如果没有指定长度,则采用默认值,即变量数值的余数。
如果两个数字(偏移量和长度)都是负数,
使用的数字则是环境变量数值长度加上指定的偏移量或长度。
%PATH:~-10%会抽取 PATH 变量的最后十个字符。
%PATH:~0,-2%会抽取 PATH 变量的所有字符,除了最后两个。

终于添加了延迟环境变量扩充的支持。
该支持总是按默认值被停用,但也可以通过 CMD.EXE 的 /V 命令行命令选项而被启用/停用。
请参阅 CMD /?

考虑到读取一行文本时所遇到的目前扩充的限制时,延迟环境变量扩充是很有用的,而不是执行的时候。
以下例子说明直接
变量扩充的问题:
    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after;
        if "%VAR%" == "after" @echo If you see this, it worked
    )

不会显示消息,因为在读到第一个 IF 语句时,BOTH IF 语句中的 %VAR% 会被代替;
原因是: 它包含 IF 的文体,IF 是一个复合语句。
所以,复合语句中的 IF 实际上是在比较 "before" 和"after",这两者永远不会相等。
同样。以下这个例子也不会达到预期效果:
    set LIST=
    for %i in (*) do set LIST=%LIST% %i
    echo %LIST%

原因是,它不会在目前的目录中建立一个文件列表,而只是将LIST 变量设成找到的最后一个文件。
这也是因为 %LIST% 在FOR 语句被读取时,只被扩充了一次;
而且,那时的 LIST 变量是空的。
因此,我们真正执行的 FOR 循环是:
    for %i in (*) do set LIST= %i
这个循环继续将 LIST 设成找到的最后一个文件。
延迟环境变量扩充允许您使用一个不同的字符(惊叹号)在执行时间扩充环境变量。
如果延迟的变量扩充被启用,可以将上面例子写成以下所示,以达到预期效果:
    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "!VAR!" == "after" @echo If you see this, it worked
    )
    set LIST=
    for %i in (*) do set LIST=!LIST! %i
    echo %LIST%

如果命令扩展名被启用,有几个动态环境变量可以被扩展,但不会出现在 SET 显示的变量列表中。
每次变量数值被扩展时,这些变量数值都会被动态计算。
如果用户用这些名称中任何一个定义变量,那个定义会替代下面描述的动态定义:

windows 系统变量清单

他们的值由系统将其根据事先定义的条件自动赋值,也就是这些变量系统已经给他们定义了值,
不需要我们来给他赋值,我们只需要调用而已,我把他们全部列出来!
%ALLUSERSPROFILE%  (allusersprofile)本地 返回“所有用户”配置文件的位置。 C:Documents and SettingsAll Users
%APPDATA% (appdata)本地返回默认情况下应用程序存储数据的位置。 C:Documents and SettingsAdministratorApplication Data

%CD% (cd)本地返回当前目录字符串。 C:Documents and SettingsAdministrator桌面
%CMDCMDLINE% (cmdcmdline)本地返回用来启动当前的 Cmd.exe 的准确命令行。
%CMDEXTVERSION%(cmdextversion)系统返回当前的“命令处理程序扩展”的版本号。2
%COMPUTERNAME% (computername)系统返回计算机的名称。 xxxx
%COMSPEC% (comspec) 系统返回命令行解释器可执行程序的准确路径。 C:WINDOWSsystem32cmd.exe
%DATE% 系统返回当前日期

%ERRORLEVEL% (errorlevel) 系统返回上一条命令的错误代码。通常用非零值表示错误。

%HOMEDRIVE% (homedrive)系统返回连接到用户主目录的本地工作站驱动器号。
基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。 C:
%HOMEPATH% (homepath) 系统返回用户主目录的完整路径。基于主目录值而设置。
用户主目录是在“本地用户和组”中指定的。 Documents and SettingsAdministrator
%HOMESHARE% (homeshare) 系统返回用户的共享主目录的网络路径。基于主目录值而设置。
用户主目录是在“本地用户和组”中指定的。
%LOGONSERVER% (logonserver) 本地返回验证当前登录会话的域控制器的名称 / xxxx

%NUMBER_OF_PROCESSORS% (numeer_of_processors) 系统指定安装在计算机上的处理器的数目。

%OS% (os)系统返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。 Windows_NT

%PATH% (path)系统指定可执行文件的搜索路径。
%PATHEXT% (pathext)系统返回操作系统认为可执行的文件扩展名的列表。
%PROCESSOR_ARCHITECTURE% (processor_architecture) 系统返回处理器的芯片体系结构。值:x86 或 IA64 基于Itanium x86
%PROCESSOR_IDENTFIER% (processor_identfier)系统返回处理器说明。
%PROCESSOR_LEVEL% (processor_level)系统返回计算机上安装的处理器的型号。 15
%PROCESSOR_REVISION% (processor_revision)系统返回处理器的版本号。 4f02
%PROMPT% (prompt)本地 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。$P$G
%RANDOM% (random)系统返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。 30580
%SYSTEMDRIVE% (systemdrive)系统返回包含 Windows server operating system 根目录(即系统根目录)的驱动器。 C:

%SYSTEMROOT% (systemroot)系统返回 Windows server operating system 根目录的位置。C:WINDOWS
%TEMP%(temp) C:DOCUME~1ADMINI~1LOCALS~1Temp和 %TMP% (tmp)

%TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。

%USERDOMAIN% (userdomain)本地返回包含用户帐户的域的名称。 xxxx

%USERNAME% (username)本地返回当前登录的用户的名称。 Administrator

%USERPROFILE% (userprofile)本地返回当前用户的配置文件的位置。 C:Documents and SettingsAdministrator

%WINDIR%(windir) 系统 返回操作系统目录的位置。 C:WINDOWS


测试脚本
info.bat
@echo off
cls
echo operation system informaion
echo --------------------
echo %ALLUSERSPROFILE%  (allusersprofile)
echo %APPDATA% (appdata)
echo %CD% (cd)
echo %CMDCMDLINE% (cmdcmdline)
echo %CMDEXTVERSION%(cmdextversion)
echo %COMPUTERNAME% (computername)
echo %COMSPEC% (comspec)
echo %DATE%
echo %ERRORLEVEL% (errorlevel)
echo %HOMEDRIVE% (homedrive)
echo %HOMEPATH% (homepath)
echo %HOMESHARE% (homeshare)
echo %LOGONSERVER% (logonserver)
echo %NUMBER_OF_PROCESSORS% (numeer_of_processors)
echo %OS% (os)
echo %PATH% (path)
echo %PATHEXT% (pathext)
echo %PROCESSOR_ARCHITECTURE% (processor_architecture)
echo %PROCESSOR_IDENTFIER% (processor_identfier)
echo %PROCESSOR_LEVEL% (processor_level)
echo %PROCESSOR_REVISION% (processor_revision)
echo %PROMPT% (prompt)
echo %RANDOM% (random)
echo %SYSTEMDRIVE% (systemdrive)
echo %SYSTEMROOT% (systemroot)
echo %TEMP%(temp)
echo %TIME%
echo %USERDOMAIN% (userdomain)
echo %USERNAME% (username)
echo %USERPROFILE% (userprofile)
echo %WINDIR%(windir)
echo ---------------------
pause

--------------------------------------------------
1.8.if
在批程序中执行条件处理。
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
  NOT 指定只有条件为 false 的情况下, Windows 2000 才 应该执行该命令。
  ERRORLEVEL number 如果最后运行的程序返回一个等于或大于指定数字的退出编码,指定条件为 true。
  string1==string2  如果指定的文本字符串匹配,指定一个 true条件。
  EXIST filename    如果指定的文件名存在,指定一个 true 条件。
  command           如果条件符合,指定要执行的命令。
            如果指定的条件为 FALSE,ELSE 命令可随在命令之后,ELSE
                      命令将在 ELSE 关键字之后执行该命令。

ELSE 子句必须在 IF 之后出现在同一行上。例如:
    IF EXIST filename. (
        del filename.
    ) ELSE (
        echo filename. missing.
    )

因为 del 命令需要用一个新行终止,以下子句不会有效:
IF EXIST filename. del filename. ELSE echo filename. missing
由于ELSE 命令必须与 IF 命令的尾端在同一行上,以下子句也
不会有效:
    IF EXIST filename. del filename.
    ELSE echo filename. missing
如果都放在同一行上,以下子句有效:

    IF EXIST filename. (del filename.) ELSE echo filename. missing
如果命令扩展名被启用,IF 会如下改变:

    IF [/I] string1 compare-op string2 command
    IF CMDEXTVERSION number command
    IF DEFINED variable command
其中,比较运算符可以是:

    EQU - 等于
    NEQ - 不等于
    LSS - 小于
    LEQ - 小于或等于
    GTR - 大于
    GEQ - 大于或等于

及 /I 命令选项;如果该命令选项被指定,则说明要进行的字符串比较不分
大小写。/I 命令选项可以用于 IF 的 string1==string2 的形式上。这些比较都是通用的;
原因是,如果 string1 和 string2 都是由数字组成的,字符串会被转换成数字,进行数字比较。

CMDEXTVERSION 条件的作用跟 ERRORLEVEL 的一样,除了它是在跟与命令扩展名有关联的内部版本号比较。
第一个版本是 1。每次对命令扩展名有相当大的增强时,版本号会增加一个。
命令扩展名被停用时,CMDEXTVERSION 条件不是真的。

如果已定义环境变量,DEFINED 条件的作用跟 EXISTS 的一样,
除了它取得一个环境变量,返回的结果是 true。

如果没有名为 ERRORLEVEL 的环境变量,
%ERRORLEVEL%会扩充为 ERROLEVEL 当前数值的字串符表达式;
否则,您会得到其数值。运行程序后,以下语句说明 ERRORLEVEL 的用法:
    goto answer%ERRORLEVEL%
    :answer0
    echo Program had return code 0
    :answer1
    echo Program had return code 1

您也可以使用以上的数字比较:
    IF %ERRORLEVEL% LEQ 1 goto okay

如果没有名为 CMDCMDLINE 的环境变量,%CMDCMDLINE%
将在 CMD.EXE 进行任何处理前扩充为传递给 CMD.EXE 的原始命令行;否则,您会得到其数值。

如果没有名为 CMDEXTVERSION 的环境变量,
%CMDEXTVERSION% 会扩充为 CMDEXTVERSION 当前数值的
字串符表达式;否则,您会得到其数值。
--------------------------------------------------
1.9.for
.for前言
  在批处理中,for是最为强大的命令语句,它的出现,
使得解析文本内容、遍历文件路径、数值递增/递减等操作成为可能;
配合if、call、goto等流程控制语句,更是可以实现脚本复杂的自动化、智能化操作;
合理使用for语句,还能使代码大为简化,免除各位编写大量重复语句之苦。
而能否熟练使用for语句,已经成为衡量一个人批处理水平高低最主要的标准。

.for基本用法
FOR %variable IN (set) DO command [command-parameters]
  %variable  指定可替换的参数。
  (set)      指定一个或一组文件。可以使用通配符。
  command    指定对每个文件执行的命令。
  command-parameters          对特定命令所指定的参数。

command-parameters{/D,/R,/L,/F}
在批处理文件中使用 FOR 命令时, 指定变量请使用 %%variable而不要用 %variable。
变量名称是区分大小写的,所以 %i 不同于 %I.

如果命令扩展名被启用,下列额外的 FOR 命令格式会受到支持:
FOR /D %variable IN (set) DO command [command-parameters]
    如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
    检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。
如果在 /R 后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。

FOR /L %variable IN (start,step,end) DO command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。
    因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生序列 (5 4 3 2 1)。

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

或者,如果有 usebackq 选项:
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
filenameset 为一个或多个文件名。

继续到 filenameset 中的下一个文件之前,每份文件都已被打开、读取并经过处理。
处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。
然后用已找到的符号字符串变量值调用 For 循环。
以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。
跳过空白行。您可通过指定可选 "options"  参数替代默认解析操作。
这个带引号的字符串包括一个或多个指定不同解析选项的关键字。这些关键字为:

        eol=c           - 指一个行注释字符的结尾(就一个)
        skip=n          - 指在文件开始时忽略的行数。
        delims=xxx      - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。
        tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代的 for 本身。
                这会导致额外变量名称的分配。m-n格式为一个范围。
                通过 nth 符号指定 mth。如果符号字符串中的最后一个字符星号,
                          那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。
        usebackq        - 指定新语法已在下类情况中使用:                    
                          在作为命令执行一个后引号的字符串并且一个单
                          引号字符为文字字符串命令并允许在 filenameset
                          中使用双引号扩起文件名称。

某些范例可能有助:

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将每行中的第二个和第三个符号传递给 for 程序体;
用逗号和/或空格定界符号。
请注意,这个 for 程序体的语句引用 %i 来取得第二个符号,
引用 %j 来取得第三个符号,引用 %k来取得第三个符号后的所有剩余符号。
对于带有空格的文件名,您需要用双引号将文件名括起来。
为了用这种方式来使用双引号,您还需要使用 usebackq 选项,
否则,双引号会被理解成是用作定义某个要分析的字符串的。
%i 专门在 for 语句中得到说明,%j 和 %k 是通过 tokens= 选项专门得到说明的。
您可以通过 tokens= 一行指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或 'Z' 的变量。
请记住,FOR 变量名分大小写,是通用的;同时不能有 52 个以上都在使用中。
您还可以在相邻字符串上使用 FOR /F 分析逻辑;
方法是,用单引号将括号之间的 filenameset 括起来。
这样,该字符串会被当作一个文件中的一个单一输入行。
最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将括号之间的 filenameset 变成一个反括字符串。
该字符串会被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进 内存,并被当作文件分析。
因此,以下例子:
      FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i    会枚举当前环境中的环境变量名称。

另外,FOR 变量参照的替换已被增强。您现在可以使用下列选项语法:
     ~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
在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
比较易读,而且避免与不分大小写的组合键混淆。

1、for语句的形式变量I,可以换成26个字母中的任意一个,这些字母会区分大小写,
也就是说,%%I和%%i会被认为不是同一个变量;
形式变量I还可以换成其他的字符,但是,为了不与批处理中的%0~%9这10个形式变量发生冲突,
请不要随意把%%I替换为%%0 ~%%9中的任意一个;
2、in和do之间的command1表示的字符串或变量可以是一个,也可以是多个,每一个字符串或变量,
我们称之为一个元素,每个元素之间,用空格键、跳格键、逗号或等号分隔;
3、for语句依次提取command1中的每一个元素,把它的值赋予形式变量I,带到do后的command2中参与命令的执行;
并且每次只提取一个元素,然后执行一次do后的命令语句,而无论这个元素是否被带到command2中参与了command2的运行;
当执行完一次do后的语句之后,再提取command1中的下一个元素,再执行一次command2,
如此循环,直到command1中的所有元素都已经被提取完毕,该for语句才宣告执行结束;
例1
@echo off
for %%I in (bbs,bathome,cn) do echo %%I
pause
运行结果
bbs
bathome
cn
-------------------------
例2
@echo off
rem filename adrive.bat
rem display all driver list
set str=c d e f g h i j k l m n o p q r s t u v w x y z
echo 当前硬盘的分区有:
for %%i in (%str%) do if exist %%i: echo %%i:
pause

.for /f 用法详解
我们设置test.txt文件内容如下:
long long ago,
there lived a king.
her loved houses.
one day,her asked a drawer.

先来看个例子。
假如有个文本文件test.txt,内容如下:
@echo off
rem batch file is ft1.bat
cls
echo 文件内容
for /f %%i in (test.txt) do echo %%i
echo ------------------------------------------
pause

输出结果
文件内容
long
there
her
one
--------------------------------------------------
1.210 findstr 指令
在文件中寻找字符串。

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/F:file]
        [/C:string] [/G:file] [/D:dir list] [/A:color attributes]
        [strings] [[drive:][path]filename[ ...]]

  /B        在一行的开始配对模式。
  /E        在一行的结尾配对模式。
  /L        按字使用搜索字符串。
  /R        将搜索字符串作为一般表达式使用。
  /S        在当前目录和所有子目录中搜索
              匹配文件。
  /I         指定搜索不分大小写。
  /X        打印完全匹配的行。
  /V        只打印不包含匹配的行。
  /N        在匹配的每行前打印行数。
  /M        如果文件含有匹配项,只打印其文件名。
  /O        在每个匹配行前打印字符偏移量。
  /P        忽略有不可打印字符的文件。
  /A:attr   指定有十六进位数字的颜色属性。请见 "color /?"
  /F:file   从指定文件读文件列表 (/ 代表控制台)。
  /C:string 使用指定字符串作为文字搜索字符串。
  /G:file   从指定的文件获得搜索字符串。 (/ 代表控制台)。
  /D:dir    查找以分号为分隔符的目录列表
  strings   要查找的文字。
  [drive:][path]filename
            指定要查找的文件。

除非参数有 /C 前缀,请使用空格隔开搜索字符串。
例如: 'FINDSTR "hello there" x.y' 在文件 x.y 中寻找 "hello" 或
"there" 。  'FINDSTR /C:"hello there" x.y' 文件 x.y  寻找
"hello there"。

一般表达式的快速参考:
  .        通配符: 任何字符
  *        重复: 以前字符或类别出现零或零以上次数
  ^        行位置: 行的开始
  $        行位置: 行的终点
  [class]  字符类别: 任何在字符集中的字符
  [^class] 补字符类别: 任何不在字符集中的字符
  [x-y]    范围: 在指定范围内的任何字符
  /x       Escape: 元字符 x 的文字用法
  /<xyz    字位置: 字的开始
  xyz/>    字位置: 字的结束
=========================================================================
2.批处理符号简介
@,<,>>,<,|
2.1回显屏蔽@
表示不显示@后面的命令,在入侵过程中
(例如使用批处理来格式化敌人的硬盘)自然不能让对方看到你使用的命令啦.
@用法举例:通过运行批处理文件对比pause和@pause命令即可明了@的效果.
--------------------------------------------------
2.2.1重定向>,>>
将输出信息重定向到指定的设备或文件.系统默认输出到显示器.
如:echo aaaaa>a.txt 即可将本在显示器上显示的信息aaaaa输出到文件a.txt中,屏幕上没有任何显示.
如果文件a.txt本来已经存在,该命令将首先擦除a.txt中的所有信息,然后写入信息aaaaa;
如果文件a.txt本来就不存在,该命令即可新建一个a.txt文件,并写入信息aaaaa.
echo aaaaa>>a.txt 类似于echo aaaaa>a.txt.
>>与>区别在于?
如果a.txt本已存在,>a.txt会擦除a.txt中的原有内容,
如果a.txt本已存在,>>a.txt并不擦除原有内容,仅在a.txt文件的末尾添加信息aaaaa.a.txt不存在时.

2.2.2.重定向<
  将输入信息来源重定向为指定的设备或文件.
系统默认从显示器读取输入信息.
重定向使用举例:

A.将输入信息来源重定向为指定的设备[显示器]
@echo off
rem file name keyindemo.bat
rem 从屏幕的键盘得到输入
cls
echo 请任意输入字符,以回车结束:
set /p getinfo=
echo [从屏幕获得的输入信息是]
echo %getinfo%
@pause

请运行这段批处理代码的结果,
就会理解"重定向为设备(显示器)"是怎么回事

b.将输入信息来源重定向为指定的文件
@echo off
rem file name filedemo.bat
rem 从*.txt文件到输入
cls
rem filedemo.bat的文件内容
echo one,two,three,four,five,six,seven,eight,nine,ten>a.txt
echo [从文件a.txt获得的输入信息是]
set /p getinfo=<a.txt
echo %getinfo%
@pause

请运行这段批处理代码的结果,
就会理解"重定向为设备(显示器)"是怎么回事?

读者观察命令与输出即可体会到重定向的功能和效果.
--------------------------------------------------

2.3.管道符号|

将管道符号前面命令的输出结果重定向输出到管道符号后面的命令中去,作为后面命令的输入.
管道符号使用格式:command_1|command_2
管道符号使用举例:
  @echo off
  echo this is test char>a.txt
  del /p a.txt
  pause
------------------------------------
  @echo off
  echo this is test char>a.txt
  echo y|del /p a.txt
  pause

对比以上两个批处理执行结果,读者即可明白管道符的用法和效果. 

管道符号使用格式:command_1|command_2
echo y|del /p a.txt分析:
echo y相当于command_1,
del /p a.txt相当于command_2,
echo y的运行输出就是del /p a.txt的输入

  需要说明的是,上面del命令添加开关/p只是为了让读者明白管道符号的使用方法,
实际删除文件时不加/p开关即可实现无提示直接删除.

--------------------------------------------------
2.4.转义符 ^.
  将特殊符号转化为一般符号,即剥离特殊符号的特殊地位.
特殊符号指:| & > <
  比如,如果我们想输出符号“>”,直接用命令 echo > 是不行的,必须修改为 echo ^> .
其余几个特殊符号类似需要有同样的处理.
  转义字符使用举例:
  @echo off
  echo aaaa>a.txt
  echo 第一句echo执行完毕
  echo aaaa^>a.txt
  echo 第二句echo执行完毕
  pause

比较上面的两句echo,第一句echo将信息aaaa输出到了文件a.txt,而第二句echo则在直接屏幕上显示除aaaa>a.txt
--------------------------------------------------
2.5.逻辑命令符.
逻辑命令符包括:&、&&、||
&-无条件执行&符号后面的命令;
&&-当&&前面的命令成功执行时,执行&&后面的命令,否则不执行;
||-当||前面的命令失败时,执行||后面的命令,否则不执行.

  @echo off
  echo ^|^|
  reg add HKCU /v try /f||echo **成功**
  reg add HKCU1 /v try /f||echo **失败**
  echo ^&^&
  reg delete HKCU /v try /f&&echo **成功**
  reg delete HKCU /v try /f&&echo **失败**
  echo ^&
  reg delete HKCU /v try /f&echo **成功**
  reg delete HKCU /v try /f&echo **失败**
  pause

执行reg add或reg delete后,系统会给出执行结果;
我们通过echo命令也给出了“执行结果”.
对比系统和我们自己给出的结果,既可以验证逻辑命令的判断机理.

------------------------------------------------------------
3.常用DOS命令
.文件夹管理.
  cd 显示当前目录名或改变当前目录.
  md 创建目录.
  rd 删除一个目录.
  dir 显示目录中的文件和子目录列表.
  tree 以图形显示驱动器或路径的文件夹结构.
  path 为可执行文件显示或设置一个搜索路径.
  xcopy 复制文件和目录树.
.文件管理.
  type 显示文本文件的内容.
  copy 将一份或多份文件复制到另一个位置.
  del 删除一个或数个文件.
  move 移动文件并重命名文件和目录.(Windows XP Home Edition中没有)
  ren 重命名文件.
  replace 替换文件.
  attrib 显示或更改文件属性.
  find 搜索字符串.
  fc 比较两个文件或两个文件集并显示它们之间的不同
.网络命令
  ping 进行网络连接测试、名称解析
  ftp 文件传输
  net 网络命令集及用户管理
  telnet 远程登陆
  ipconfig显示、修改TCP/IP设置
  msg 给用户发送消息
  arp 显示、修改局域网的IP地址-物理地址映射列表

.系统管理.
  at 安排在特定日期和时间运行命令和程序
  shutdown立即或定时关机或重启
  tskill 结束进程
  taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
  tasklist显示进程列表(Windows XP Home Edition中没有)
  sc 系统服务设置与控制
  reg 注册表控制台工具
  powercfg控制系统上的电源设置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值