分享

批处理学习5

 菜园子图书馆 2014-02-04

Shift

 

更改批处理文件中批处理参数的位置。

语法

shift

参数

注释

  • shift 命令行选项与命令扩展一起使用

    启用命令扩展(默认设置)后,shift 命令支持 /n 命令行选项,该选项通知命令在第 n 个参数处开始更改,n 可以是 0 到 8 的任何一个值。例如,

    SHIFT /2

    可以将 %3 改为 %2,将 %4 改为 %3 等等,而 %0%1 保持不变。

  • shift 命令的工作原理

    shift 命令通过将每个参数复制到前一个参数中,更改批处理参数 %0 到 %9 的值。也就是说,将 %1 的值复制到 %0,%2 的值复制到 %1,依次类推。该命令在撰写对任何数目的参数执行相同操作的批处理文件时非常有用。

  • 使用 10 个以上的批处理参数

    也可以使用 shift 命令创建可以接受 10 个以上批处理参数的批处理文件。如果在命令行上指定了 10 个以上的参数,第十个 (%9) 参数之后的参数将更改为 %9,一次更改一个。

  • 将 %* 与 shift 一起使用

    Shift 对 %* 批处理参数没有影响。

  • 恢复参数

    没有反向的 shift 命令。执行了 shift 命令后,不能恢复更改前存在的第一个批处理参数 (%0)。

范例

以下批处理文件 Mycopy.bat 显示了如何使用包含任意数目批处理参数的 shift 命令。该批处理文件将一列文件复制到特定的目录。批处理参数由目录和文件名参数表示。

 

批处理示例14:

@echo off
rem MYCOPY.BAT copies any number of files
rem to a directory.
rem The command uses the following syntax:
rem mycopy dir file1 file2 ...
set todir=%1
:getfile
shift
if "%1"=="" goto end
copy %1 %todir%
goto getfile
:end
set todir=
echo All done

Setlocal 
开始批处理文件中环境变量的本地化。本地化将持续到出现匹配的 endlocal 命令或者到达批处理文件结尾为止。

语法 setlocal {enableextension | disableextensions} {enabledelayedexpansion | disabledelayedexpansion}

参数
enableextension
启用命令扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
disableextensions
禁用命令扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
enabledelayedexpansion
启用延迟的环境变量扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
disabledelayedexpansion
禁用延迟的环境变量扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
/?
在命令提示符显示帮助。
注释
使用 setlocal
当您在脚本或批处理文件外使用 setlocal 时,将没有效果。

更改环境变量
运行批处理文件时使用 setlocal 更改环境变量。运行 setlocal 后对环境所作的更改在批处理文件本地。Cmd.exe 在遇到 endlocal 命令或者到达批处理文件的结尾时将恢复上一次的设置。

在批处理程序中可以包含多个 setlocal 或 endlocal 命令(嵌套)。
测试批处理文件中的命令扩展
setlocal 命令设置 ERRORLEVEL 变量。如果遇到 {enableextension | disableextensions} 或 {enabledelayedexpansion | disabledelayedexpansion},ERRORLEVEL 变量将设置成 0 (0)。否则,该变量将被设置成 1 (1)。在批处理脚本中使用该命令可以确定扩展是否可用,例如:

 

 

示例15:

verify other 2>nul
setlocal enableextensions
if errorlevel 1 echo Unable to enable extensions

 


因为当禁用命令扩展时 cmd 不会设置 ERRORLEVEL 变量,所以当通过无效参数使用 setlocal 命令时 verify 命令将 ERRORLEVEL 变量初始化为非零值。另外,如果通过 {enableextension | disableextensions} 或 {enabledelayedexpansion | disabledelayedexpansion} 参数使用 setlocal 命令,而且没有将 ERRORLEVEL 变量设置成 1 (1) 时,则命令扩展将不可用。

有关启用或禁用命令扩展的详细信息,请参阅“相关主题”中的 cmd。

范例
可以在批处理文件中本地化环境变量,如下所示:

 

 

批处理示例16:

rem *******Begin Comment**************
rem This program starts the superapp batch program on the network,
rem directs the output to a file, and displays the file
rem in Notepad.
rem *******End Comment**************
@echo off
setlocal
path=g:\programs\superapp;%path%
call superapp>c:\superapp.out
endlocal
start notepad c:\superapp.out

 


Endlocal

结束批处理文件中环境更改的本地化,将环境变量还原为匹配 setlocal 命令前的值。

语法
endlocal

参数
/?
在命令提示符显示帮助。
注释
必须在脚本或批处理文件中使用 endlocal。如果在脚本或批处理文件之外使用 endlocal,则该命令无效。
在批处理文件的结尾处有一个隐含的 endlocal 命令。
通过启用命令扩展名(即,默认值),endlocal 命令将命令扩展名的状态(即,已启用或已禁用)还原到执行匹配 setlocal 命令之前的状态。有关启用和禁用命令扩展名的详细信息,请参阅“相关主题”中的 cmd。
范例
在批处理文件中可以本地化环境变量。例如:

 

 

批处理示例17:

@echo off

rem This program starts the superapp batch program on the network,

rem directs the output to a file, and displays the file

rem in Notepad.

setlocal

path=g:\programs\superapp;%path%

call superapp>c:\superapp.out

endlocal

start notepad c:\superapp.out

 

 

Call

从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。

语法
call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]

参数
[Drive:}[Path] FileName
指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd 扩展名。
BatchParameters
指定批处理程序所需的任何命令行信息,包括命令行选项、文件名、批处理参数(从 %0 到 %9)或变量(例如,%baud%)。
:label
指定批处理程序要跳转到的标签。使用带有该参数的 call 命令可以创建新的批处理文件上下文,并将控制权交给指定标签后的语句。当首次遇到该批处理文件的末尾时(在跳转到标签后),控制权将交还给 CALL 语句后的语句。第二次遇到批处理文件的末尾,批脚本将被退出。对于可允许您从批处理脚本返回的 goto :eof 命令扩展,要了解关于它的说明,请参阅“相关主题”。
arguments
对于以 :label 打头的批处理程序,指定要传送给其新实例的命令行信息,包括命令行选项、文件名、批处理参数(从 %1 到 %9)或者变量(比如 %baud%)。
/?
在命令提示符显示帮助。
注释
使用批处理参数
批处理参数可以含有传送给批处理程序的任何信息,包括命令行选项、文件名、批处理参数(从 %1 到 %9)或者变量(例如,%baud%)。有关批处理参数的详细信息,请参阅“相关主题”。

使用管道和重定向符号
不要在 call 命令中使用管道和重定向符号。

发出递归调用
可以创建调用自身的批处理程序,但是,必须提供退出条件。否则,父和子批处理程序可以无限循环。

使用命令扩展
如果启用命令扩展(即默认情况下),call 将接受 label 参数作为调用目标。正确语法如下:

call :label arguments

有关启用和禁用命令扩展的详细信息,请参阅“相关主题”中的 cmd。

范例
要从其他批处理程序运行 Checknew.bat 程序,请在父批处理程序中键入以下命令:

call checknew

如果父批处理程序接受两个批处理参数并且希望它将这些参数传递给 Checknew.bat,则可以在父批处理程序中使用以下命令:

call checknew %1 %2

 

For

对一组文件中的每个文件运行指定的命令。

语法:for {%variable|%%variable} in (set) do command [ CommandLineOptions]

参数
{%variable|%%variable} 必需。代表可替换的参数。使用 %variable 通过命令提示符执行 for 命令。使用 %%variable 在批处理文件中执行 for 命令。变量要区分大小写,并且必须用 Alpha 值表示,例如,%A、%B 或 %C。
(set) 必需。指定要用指定命令处理的一个或多个文件、目录、数值范围以及文本字符串。需要括号。
command 必需。指定要对包括在指定 (set) 中的每个文件、目录、数值范围以及文本字符串所执行的命令。
CommandLineOptions 指定要通过指定命令使用的任何命令行选项。
/? 在命令提示符显示帮助。


注释


使用 for
可以在批处理文件中或直接从命令提示符使用 for 命令。

使用批处理参数
下列属性适用于 for 命令:

for 命令使用指定 set 中的每个文本字符串替换 %variable 或 %%variable,直到 command 处理所有文件为止。
记住,for variable名是区分大小写、全局的,并且每次总共不超过 52 个是活动的。
要避免批处理参数从 %0 到 %9 混淆,对 variable 可以使用除数字 0 到 9 之外的任何字符。对于简单的批处理文件,单个字符即可奏效,例如 %%f。
在复杂的批处理文件中可以使用 variable 的多个值来区分不同的可替换变量。
显示一组文件
set 参数可以代表单个或多个文件组。可以使用通配符(即,* 和 ?)指定文件组。以下为有效文件组:

(*.doc)

(*.doc *.txt *.me)

(jan*.doc jan*.rpt feb*.doc feb*.rpt)

(ar??1991.* ap??1991.*)

在使用 for 命令时,set 中的第一个值代替 %variable 或 %%variable,然后由指定的命令处理该值。这一直会继续下去,直到处理完与 set 值相对应的所有文件(或文件组)为止。

使用 in 和 do 关键字
In 和 do 不是参数,但必须将它们与 for 一起使用。如果省略其中任何一个关键字,就会出现错误消息。

使用 for 的其它形式
如果命令扩展名处于启用状态(即,默认设置),则支持 for 的下列其它形式:

仅为目录
如果 set 包含通配符(* 和 ?),则为匹配 set 的每个目录(而不是指定目录中的文件组)而执行指定的 command。语法是:

for /D {%% | %}variable in (set) do command [CommandLineOptions]

递归
进入根目录树 [Drive:]Path,在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录,则假定为当前目录。如果 set 只是一个句号 (.),则只列举目录树。语法是:

for /R [[Drive :]Path] {%% | %}variable in (set) do command [CommandLineOptions]

重复数值范围
使用迭代变量设置起始值 (start#) ,然后一步步执行一系列设置范围的值,直到该值超过设置的终止值 (end#)。/L 将通过对 start# 与 end# 进行比较,执行迭代变量。如果 start# 小于 end#,就会执行该命令。如果迭代变量超过 end#,则命令解释程序退出此循环。也可以使用负 step# 以递减数值的方式一步步执行此范围内的值。例如,(1,1,5) 生成顺序 1 2 3 4 5,而 (5,-1,1) 则生成顺序 (5 4 3 2 1)。语法是:

for /L {%% | %}variable in (start#,step#,end#) do command [CommandLineOptions]

重复和文件解析
使用文件解析过程处理命令输出、字符串和文件内容。使用迭代变量定义要检查的内容或字符串,以及使用各种 ParsingKeywords 选项进一步修改解析方式。使用 ParsingKeywords 令牌选项指定哪些令牌应该传递为迭代程序变量。注意:在没有使用令牌选项时,/F 将仅检查第一个令牌。

文件解析过程包括读取输出、字符串或文件内容、分成独立的文本行及然后将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代程序变量值,调用 for 循环。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。语法的不同点为:

for /F ["ParsingKeywords"] {%% | %}variable in (filenameset) do command [CommandLineOptions]

for /F ["ParsingKeywords"] {%% | %}variable in ("LiteralString") do command [CommandLineOptions]

for /F ["ParsingKeywords"] {%% | %}variable in ('command') do command [CommandLineOptions]

filenameset 参数指定一个或多个文件名称。在继续到 filenameset 中的下一个文件之前,每个文件都会被打开、读取和处理。要覆盖默认解析行为,指定 "ParsingKeywords"。这是一个引用字符串,它包含一个或多个关键字以指定不同的解析选项。

如果使用 usebackq 选项,请使用如下语法之一:

for /F ["usebackqParsingKeywords"] {%% | %}variable in ("filenameset") do command [CommandLineOptions]

for /F ["usebackqParsingKeywords"] {%% | %}variable in ('LiteralString') do command [CommandLineOptions]

for /F ["usebackqParsingKeywords"] {%% | %}variable in (`command`) do command [CommandLineOptions]

下表列出可以用于 ParsingKeywords 的解析关键字。

 

 关键字  说明
 eol=c  指定行尾字符(只一个字符)。
 skip=n  指定在文件的开头跳过的行数。
 delims=xxx  指定定界符集合。这将替换空格和制表符的默认分隔符集。
 tokens=x,y,m-n

 指定将哪些令牌从每行传递到每个迭代的 for 正文。结果就分配了附加变量名

 称。m-n 格式是一个范围,指定从 mth 到 nth 的令牌。如果 tokens=字符串中

 最后一个字符是星号 (*),则将分配附加的变量,并在解析的最后一个令牌后在

 行上接收剩余的文本。

 usebackq

 指定可以使用引号引用 filenameset 中的文件名称,将后面带有引号的字符串

 作为一个命令执行,而带有单引号的字符串是文字字符串命令。

 

 

变量替换

已经增强了 for 变量引用的替换修改程序。下表列出可选语法(对于任意变量 I)。

 

 

 带有修改序的变量

 说明
 %~I  展开删除任何前后引号 ("") 的 %I。
 %~fI  将 %I 展开到完全合格的路径名。
 %~dI  只将 %I 展开到驱动器号。
 %~pI  只将 %I 展开到路径。
 %~nI  只将 %I 展开到文件名。
 %~xI  只将 %I 展开到文件扩展名。
 %~sI  展开路径以只包含短名称。
 %~aI  将 %I 展开到文件的文件属性。
 %~tI  将 %I 展开到文件的日期和时间。
 %~zI  将 %I 展开到文件大小。
 %~$PATH:I

 搜索 PATH 环境变量所列出的目录,并将 %I 展开到第一个找到的完全合格的名称。如果没有定义环境变量名称,或搜索没有找到文件,则此修改程序扩展成空字符串。

 

 

下表列出可用来获得综合结果的修改程序组合。

 

 

 变量(使用组合的修改程序)

 说明
 %~dpI  只将 %I 展开到驱动器号和路径。
 %~nxI  只将 %I 展开到文件名和扩展名。
 %~fsI  将 %I 展开到只包含短名称的完整路径名。
 %~dp$PATH:I

 在 PATH 环境变量中所列出的目录中搜索 %I,并展开到第一个找到结果的驱动器号和路径。

 %~ftzaI  将 %I 展开到输出行(如 dir一样)。

 

 

在上述范例中,可以用其它有效值替换 %I 和 PATH。有效的 for 变量名终止 %~ syntax。

使用大写变量名(例如 %I),可以使代码更具可读性,并且避免与不区分大小写的修改程序混淆。

解析字符串
通过将 Filenameset 包括在圆括号内,并且外面再带上单引号(即,'filenameset'),可以使用 for /F 对直接字符串解析逻辑。将 Filenameset 视为从某个文件输入的单行,然后接受解析。

解析输出
通过将圆括号之间的 filenameset 变为后面带有引号的字符串,可以利用 for /F 命令解析命令输出。将它作为命令行,此命令被传递给子 Cmd.exe,并将输出捕获到内存并进行解析,就象它是一个文件一样。

范例
要在批处理文件中使用 for,请使用以下语法:

for %%variable in (set) do command [CommandLineOptions]

要通过使用可替换变量 %f 显示当前目录中扩展名为 .doc 或 .txt 的所有文件的内容,请键入:

for %f in (*.doc *.txt) do type %f

在前述范例中,当前目录中扩展名为 .doc 或 .txt 的每个文件都被替代为变量 %f ,直到每个文件的内容都显示为止。要在批处理文件中使用该命令,只需使用 %%f 替换 %f 的每个事件。否则忽略此变量,并显示一条错误消息。

要解析文件,同时忽略注释行,请键入:

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
这个范例列举当前环境中的环境变量名。

 

 

for in (%windir%\system32\*.dll) do regsvr32.exe /s

 

 有关 regsvr32.exe 命令的详细信息,参阅http://blog.sina.com.cn/s/blog_51a4af870100a54u.html 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多