<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>绿色记忆 &#187; BAT</title>
	<atom:link href="https://blog.gmem.cc/tag/bat/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.gmem.cc</link>
	<description></description>
	<lastBuildDate>Mon, 06 Apr 2026 12:46:48 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.14</generator>
	<item>
		<title>MS-DOS批处理学习笔记</title>
		<link>https://blog.gmem.cc/bat</link>
		<comments>https://blog.gmem.cc/bat#comments</comments>
		<pubDate>Fri, 02 Jul 2004 06:46:12 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[BAT]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[DOS]]></category>
		<category><![CDATA[学习笔记]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1937</guid>
		<description><![CDATA[<p>基础知识 关于目录 任何一个目录下均有[crayon-69d4d1eedbd9b346675854-i/]、[crayon-69d4d1eedbda1668132053-i/]这两个虚拟目录，其中[crayon-69d4d1eedbda3663079439-i/]指向当前目录，[crayon-69d4d1eedbda5849313267-i/]指向上级目录： [crayon-69d4d1eedbda7037858577/] 基本命令与概念 符号  说明 @前缀 取消当前命令的回显 ECHO OFF 禁用命令回显 SET 显示、设置或删除环境变量 [crayon-69d4d1eedbda9665241097/] ECHO. 显示空行 PUSHD 压栈并切换到指定工作目录，例如PUSHD C:\TEMP POPD 弹出并回到上一个工作目录 <a class="read-more" href="https://blog.gmem.cc/bat">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/bat">MS-DOS批处理学习笔记</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">基础知识</span></div>
<div class="blog_h2"><span class="graybg">关于目录</span></div>
<p>任何一个目录下均有<pre class="crayon-plain-tag">.</pre>、<pre class="crayon-plain-tag">..</pre>这两个虚拟目录，其中<pre class="crayon-plain-tag">.</pre>指向当前目录，<pre class="crayon-plain-tag">..</pre>指向上级目录：</p>
<pre class="crayon-plain-tag">pushd D:\Programs\chrome

rem 下面两条还是进入当前目录
cd D:\Programs\chrome\.
cd Programs\chrome\.\.\.

rem 进入上级目录
cd D:\Programs\chrome\..
rem 进入上级目录的上级目录
cd D:\Programs\chrome\..\..</pre>
<div class="blog_h2"><span class="graybg">基本命令与概念</span></div>
<table style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<thead>
<tr>
<td style="width: 100px; text-align: center;">符号</td>
<td style="text-align: center;"> 说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>@前缀</td>
<td>取消当前命令的回显</td>
</tr>
<tr>
<td>ECHO OFF</td>
<td>禁用命令回显</td>
</tr>
<tr>
<td>SET</td>
<td>显示、设置或删除环境变量<br />
<pre class="crayon-plain-tag">rem expression被扩展为算术表达式
SET /A variable=expression
rem 从标准输入读入一行，promptString为读入前显示的文本
SET /P variable=[promptString]</pre>
</td>
</tr>
<tr>
<td>ECHO.</td>
<td>显示空行</td>
</tr>
<tr>
<td>PUSHD</td>
<td>压栈并切换到指定工作目录，例如PUSHD C:\TEMP</td>
</tr>
<tr>
<td>POPD</td>
<td>弹出并回到上一个工作目录</td>
</tr>
<tr>
<td>组合命令</td>
<td>&amp;：串联多个命令，依次执行<br /> &amp;&amp;：只有前面命令成功了，后面命令才执行<br /> ||：只有前面命令失败了，后面命令才执行</td>
</tr>
<tr>
<td>" "</td>
<td>字符串界定符——允许在字符串中包含空格</td>
</tr>
<tr>
<td>^</td>
<td>
<p>转义字符，例如^G表示响铃</p>
<p>在行尾，表示下一行的内容与这一行作为<span style="background-color: #c0c0c0;">单行</span>看待</p>
</td>
</tr>
<tr>
<td>*</td>
<td>通配0-N个字符</td>
</tr>
<tr>
<td>%</td>
<td>批处理变量引导符。%VAR%引用环境变量，%n引用调用参数，%*表示所有调用参数</td>
</tr>
<tr>
<td>!VAR!</td>
<td>变量延迟扩展符</td>
</tr>
<tr>
<td>?</td>
<td>通配单个字符</td>
</tr>
<tr>
<td>COLOR</td>
<td>设置背景前景色，使用一位数表示颜色。例如COLOR 47表示红色背景白色文字</p>
<p>0 = 黑色 1 = 蓝色 3 = 湖蓝色 B = 淡浅绿色 4 = 红色 C = 淡红色 5 = 紫色<br /> 6 = 黄色E = 淡黄色 7 = 白色 8 = 灰色 9 = 淡蓝色 2 = 绿色 A = 淡绿色  D = 淡紫色</p>
</td>
</tr>
<tr>
<td>TITLE</td>
<td>设置窗口标题</td>
</tr>
<tr>
<td>FIND</td>
<td>
<p>在文本中搜索字符串，命令格式： </p>
<pre class="crayon-plain-tag">FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]</pre>
<p>/V 显示所有未包含指定字符串的行<br /> /C 仅显示包含字符串的行数<br /> /N 显示行号<br /> /I 搜索字符串时忽略大小写<br /> /OFF[LINE] 不要跳过具有脱机属性集的文件"string" 指定要搜索的文字串<br /> [drive:][path]filename 指定要搜索的文件</p>
</td>
</tr>
<tr>
<td>ATTRIB</td>
<td>显示或更改文件属性，命令格式：<br />
<pre class="crayon-plain-tag">ATTRIB [+R|-R] [+A|-A] [+S|-S] [+H|-H] [[drive:] [path] filename] [/S [/D]]</pre></p>
<p>+ 设置属性， - 清除属性<br />R 只读文件属性， A 存档文件属性， S 系统文件属性， H 隐藏文件属性<br />/S 处理当前文件夹及其子文件夹中的匹配文件， /D 也处理文件夹</p>
</td>
</tr>
<tr>
<td>NUL</td>
<td>空设备<br /><pre class="crayon-plain-tag">1&gt;nul</pre>  表示禁止输出一般信息（重定向标准输出到空设备）<br /><pre class="crayon-plain-tag">2&gt;nul</pre> 表示禁止输出错误信息（重定向标准错误到空设备）</td>
</tr>
<tr>
<td>Ctrl+C</td>
<td>按键中断批处理执行</td>
</tr>
<tr>
<td>Ctrl+S</td>
<td>暂停或者恢复显示</td>
</tr>
<tr>
<td>~</td>
<td>扩展符号，对于变量%1，可以这样使用%~x1：取变量的扩展名。支持的扩展列表：</p>
<p>%~1 扩展 %1 并删除任何引号 ("")<br /> %~f1 将 %1 扩展到全限定的路径名<br /> %~d1 将 %1 扩展到驱动器盘符<br /> %~p1 将 %1 扩展到路径<br /> %~n1 将 %1 扩展到文件名<br /> %~x1 将 %1 扩展到文件扩展名<br /> %~s1 扩展的路径仅包含短名称<br /> %~a1 将 %1 扩展到文件属性<br /> %~t1 将 %1 扩展到文件日期/时间<br /> %~z1 将 %1 扩展到文件大小<br /> %~$PATH:1 搜索 PATH 环境变量中列出的目录，并将 %1 扩展到第一个找到的目录的完全限定名称。如果没有定义环境变量名称，或没有找到文件，则此符号扩展成空字符串</p>
<div>获取bat所在目录的例子：</div>
<pre class="crayon-plain-tag">set BAT_PATH0=%~dp0
set BAT_PATH=%BAT_PATH0:~0,-1%
for %%f in (%BAT_PATH%) do set BAT_FOLDER=%%~nxf
echo %BAT_FOLDER%</pre>
</td>
</tr>
<tr>
<td>|</td>
<td>管道符：将一个命令的输出作为另外一个命令的输入</td>
</tr>
<tr>
<td>&gt; TARGET</td>
<td>重定向输出<br />
<pre class="crayon-plain-tag">rem 将第一个命令的输出作为第二个命令的输入
command1&gt;commana2  
rem 将输出发送到指定的文件，必要的时候需要创建该文件或重写
command&gt;[path]filename
rem 将输出附加到指定的文件（如果该文件存在），或者创建该文件并向其写入
command&gt;&gt;[path]filename
rem 从指定的文件中获取命令的输入，之后将命令的输出发送到指定的文件
command&lt;[path] filename &gt;[path]filename
rem 从指定的文件中获取命令的输入，之后将命令的输出附加到指定的文件
command&lt;[path]filename&gt;&gt;[path]fllename
rem 创建指定的文件，之后将错误输出发送到该文件。如果该文件存在，则其内容会被重写
command 2&gt; [path]filename
rem 将错误输出信总发送到标准输出
command 2&gt;&amp;1
rem 将标准错误丢弃，不显示
command 2&gt; nul
rem 从指定的文件路径中提取命令的输入信息
command&lt;[path]filename</pre>
</td>
</tr>
<tr>
<td>&gt;&gt; TARGET</td>
<td>重定向输出，附加模式</td>
</tr>
<tr>
<td>&lt; SOURCE</td>
<td>重定向输入</td>
</tr>
<tr>
<td>REM</td>
<td>注释，内容可以回显。::这样的注释则不会回显</td>
</tr>
<tr>
<td>PAUSE</td>
<td>暂停执行，按任意键继续ECHO 定制的提示语 &amp; pause &gt; nul</td>
</tr>
<tr>
<td>SHIFT</td>
<td>参数移位，即第二个参数变为第一个，第一个移除，命令格式 SHIFT n ，其中 0&lt;=n&lt;=8</td>
</tr>
<tr>
<td>CALL</td>
<td>在一个批处理程序中调用另外一个，执行完毕后返回CALL :label arguments，调用当前批处理文件内的命令段——:label开头，以命令goto :eof结尾的部分</td>
</tr>
<tr>
<td>START</td>
<td>在新的命令行窗口中执行程序，命令格式：start ["title"] [/dPath] [/i] [/min] [/max] [{/separate | /shared}] [{/low | /normal | /htgh | /realtime | /abovenormal | belownormal}] [/wait] [/b] [FileName] [parameters]
<p>title:指定在“命令提示符”窗口标题栏中显示的标题<br /> /dPath:指定启动目录<br /> /i:将Cmd.exe启动环境传送到新的“命令提示符”窗口<br /> /min:启动新的最小化“命令提示符”窗口<br /> /max:启动新的最大化“命令提示符”窗口<br /> /separate:在单独的内存空间启动16位程序<br /> /shared:在共享的内存空间启动16位程序<br /> /low:以空闲优先级启动应用程序<br /> /normal:以一般优先级启动应用程序<br /> /high:以高优先级启动应用程序<br /> /realtime:以实时优先级启动应用程序<br /> /abovenormal：以超出常规优先级的方式启动应用程序<br /> /bdownormal:以低出常规优先级的方式启动应用程序<br /> /wait:启动应用程序，并等待其结束<br /> /b:启动应用程序时不必打开新的“命令提示符”窗口<br /> FileName:指定要启动的命令或程序<br /> parameters:指定要传送给命令或程序的参數</p>
</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">动态环境变量</span></div>
<table style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<thead>
<tr>
<td style="width: 100px; text-align: center;">变量</td>
<td style="text-align: center;"> 说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>%CD%</td>
<td>扩展到当前目录字符串</td>
</tr>
<tr>
<td>%DATE%</td>
<td>用跟 DATE 命令同样的格式扩展到当前日期</td>
</tr>
<tr>
<td>%TIME%</td>
<td>用跟 TIME 命令同样的格式扩展到当前时间</td>
</tr>
<tr>
<td>%RANDOM%</td>
<td>扩展到 0 和 32767 之间的任意十进制数字</td>
</tr>
<tr>
<td>%ERRORLEVEL%</td>
<td>扩展到当前 ERRORLEVEL 数值</td>
</tr>
<tr>
<td>%CMDEXTVERSION%</td>
<td>扩展到当前命令处理器扩展名版本号</td>
</tr>
<tr>
<td>%CMDCMDLINE%</td>
<td>扩展到调用命令处理器的原始命令行</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">批处理参数</span></div>
<table style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<thead>
<tr>
<td style="text-align: center;">参数</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>%0</td>
<td>批处理文件的名字</td>
</tr>
<tr>
<td>%1 - %9</td>
<td>第1-9个参数</td>
</tr>
<tr>
<td>%~nx0</td>
<td>批处理文件的名字，例如some-batch.bat</td>
</tr>
<tr>
<td>%~dp0</td>
<td>批处理文件所在目录，例如C:\scripts</td>
</tr>
<tr>
<td>%~dpnx0</td>
<td>批处理文件全限定名</td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg">批处理编程</span></div>
<div class="blog_h2"><span class="graybg">变量管理</span></div>
<div class="blog_h3"><span class="graybg">setlocal</span></div>
<p>setlocal命令可在批处理程序运行时设置自身的临时变量环境（仅对当前批处理程序有效），直到出现endlocal</p>
<pre class="crayon-plain-tag">#同时启用变量延迟扩展
setlocal enabledelayedexpansion</pre>
<div class="blog_h3"><span class="graybg">set</span></div>
<p>set命令用于创建、设置或者删除环境变量，命令格式：<pre class="crayon-plain-tag">set [[/a [expression]] [/p [variable=]] string]</pre></p>
<p>参数说明：</p>
<ol>
<li><pre class="crayon-plain-tag">/a</pre>：将string设置成可求值的数学表达式，expression:合法的表达式，表达式支持的运算符按优先级降序如下：<br />
<table style="width: 50%;" border="1" cellspacing="0" cellpadding="5">
<thead>
<tr>
<td style="text-align: center;">运算符</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>()</td>
<td>分组</td>
</tr>
<tr>
<td>! ~ -</td>
<td>一元运算符</td>
</tr>
<tr>
<td>* / % + -</td>
<td>算术运算符</td>
</tr>
<tr>
<td>&lt;&lt; &gt;&gt;</td>
<td>移位</td>
</tr>
<tr>
<td>&amp; ^ |</td>
<td>按位与非或</td>
</tr>
<tr>
<td>
<p>=   *=   /=   %=   +=   -=<br />&amp;=   ^=   |=   &lt;&lt;=   &gt;&gt;=</p>
</td>
<td>赋值</td>
</tr>
<tr>
<td>,</td>
<td>表达式分隔符</td>
</tr>
</tbody>
</table>
</li>
<li><pre class="crayon-plain-tag">/p</pre>：将variable的值设置成输入行，variable:指定需要设置或修改的变量</li>
<li><pre class="crayon-plain-tag">string</pre>：指定要与指定变量关联的字符串</li>
</ol>
<p>举例：</p>
<pre class="crayon-plain-tag">REM 设置VAR1为Hello
SET VAR1=Hello
REM 提示用户输入
SET /P variable=请输入值
REM 设置变量为表达式的值，下面为VAR1递增
SET /a VAR1=VAR1+1
REM 设置VAR1为"Hello"
SET  VAR1="Hello"
REM 如果变量值包含命令关键字，可以使用双引号包围：
SET "VAR1=&amp;amp;"
REM 删除变量
SET VAR1=</pre>
<div class="blog_h2"><span class="graybg">条件测试</span></div>
<p>注意对环境变量进行条件测试的时候，不能带<span style="background-color: #c0c0c0;"><strong>%%</strong></span>。</p>
<pre class="crayon-plain-tag">REM 文件存在性测试（注意，不能用来测试环境变量）
IF [NOT] EXIST FILENAME.EXT Command
if not exist SERVICE_NAME &amp;nbsp;set "SERVICE_NAME=%SERVICE_NAME_DEFAULT%"
REM 如果有多行命令需要执行，可以用()包围：
set /p VENDER_NAME=
IF NOT Gmem=VENDER_NAME (
    echo.
)
REM 变量是否为空测试
IF DEFINED VAR_NAME (...)
REM 字符串为空测试，这个用于stdin读入变量无效
IF [%1] == [] ECHO "Empty argument."
REM 字符串相等性测试，加上双引号避免歧义
IF "%VAR_NAME%" == "1" ECHO .
REM 注意，如果VAR_NAME来自标准输入，或者可能为空，要加上双引号，否则可能出现
REM was unexpected at this time（此时不应有）错误
REM 如果字符串可能有空格，可以使用双引号，例如 "AUTOEXE .BAT"，"%1"（第一个参数）
IF [NOT] %1 == AUTOEXEC.BAT ECHO Parameter is AUTOEXEC.BAT
REM 上一条命令返回值测试
REM 其中值为整数，只要大于等于该值，判断为真。0表示没有错误
IF [NOT] ERRORLEVEL 值 Command
REM 比较字符串大小：op可以是：EQU、NEQ、LSS、LSQ、GTR、GEQ之一，/i表示忽略大小写
if [/i] stringl op string2 command [else expression]
REM 如果变量被定义，则执行
if defined variable command [else expression]

REM IF-ELSE结构
IF EXIST filename ( 
    del filename
) ELSE ( 
    echo filename missing
)</pre>
<div class="blog_h2"><span class="graybg">分支转移GOTO</span></div>
<pre class="crayon-plain-tag">GOTO LABEL

:LABEL
ECHO done</pre>
<div class="blog_h2"><span class="graybg">for命令循环</span></div>
<div class="blog_h3"><span class="graybg">参数说明</span></div>
<ol>
<li>%variable|%%variable：代表可替换的参教：<br /> 使用<strong>%variable通过命令提示符</strong>执行for 命令，使用<strong>%%variable在批处理文件</strong>执行for命令</li>
<li>set:指定要用命令处理的<strong>一个或多个文件、目录、数值范围或文本字符串</strong></li>
<li> command:指定要对包括在指定(set)中的每个文件、目录、数值范围或文本字符 串所执行的命令</li>
<li>CommandLineOptions:命令使用的命令行选项</li>
</ol>
<div class="blog_h3"><span class="graybg">for命令的不同形式</span></div>
<table style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<thead>
<tr>
<td style="width: 300px; text-align: center;"> 用途</td>
<td style="text-align: center;">语法格式 </td>
</tr>
</thead>
<tbody>
<tr>
<td>文件集合 </td>
<td>for %%variable in (fileSet) do statement</td>
</tr>
<tr>
<td>目录集合</td>
<td>for /D %%variable in (directorySet) do statement</td>
</tr>
<tr>
<td>子目录中的文件</td>
<td>for /R [path] %%variable  in (fileSet) do statement</td>
</tr>
<tr>
<td>遍历一系列的值</td>
<td>for /L %%variable in (stepRange) do statement</td>
</tr>
<tr>
<td>分析文本文件、字符串以及命令输出</td>
<td>for /F ["options"]  %%variable in (source) do statement</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">示例：各种用法</span></div>
<pre class="crayon-plain-tag">@echo off
set /a sum=0
REM 遍历当前目录中的文本文件并打印其内容，多行命令需要用()包围
for %%x in (*. txt) do (
    echo Printing content of file %%x
    type %%x
    echo.
set /a sum=sum+1
REM 从0开始，步进2，到10结束
for /L %%B in (0 2, 10) do echo %%B

REM 下面的语句首先会运行date /t命令，其输出为类似：“2001/01/01 周一”这样的形式
REM /F 表示以字符串方式处理命令输出、字符串或者文件内容
REM tokens用于定义for命令的变量个数，1-3表示第1、2、3个字符串并解析为变量
REM delims表示用于拆分字符串的分隔符，包括/、-
REM set表示把拆分的字符串依次赋值给%%A %%B %%C三个变量（后面的变量名在前面的ASCII码加1）
REM delims可以指定多个字符用于分隔
for /F "tokens=l-3 delims=/-" %%A in ('date /T') do set date=%%A%%B%%C

rem 提取NT Service的PID的例子，注意sc queryex命令输出多行
rem 下面的for命令以行为单位进行处理，并提取第一列、第三列
rem skip可以用于跳过指定数量的行
for /F "tokens=1,3 skip=3" %%a in ('sc queryex Tomcat7') do (
    echo %%a %%b
)
rem usebackq允许在源指定符中使用引号；eol指定行尾结束字符，之后的内容被忽视
for /f "tokens=3-5 usebackq eol=#" %%C in ("user data.txt") do  echo %%C
rem 命令输出如下：
rem SERVICE_NAME:
rem TYPE 110
rem STATE 4
rem (STOPPABLE, ACCEPTS_SHUTDOWN)
rem WIN32_EXIT_CODE 0
rem SERVICE_EXIT_CODE 0
rem CHECKPOINT 0x0
rem WAIT_HINT 0x0
rem PID 5812
rem FLAGS

REM tokens更复杂的例子
REM tokens=x 表示只提取第x列。
REM tokens=x,y 表示只提取第x列和第y列。
REM tokens=m-n 表示提取第m列至第n列。
REM tokens=x* 表示提取第x列和后面所有字符串都作为第x+1列。
REM tokens=x,* 等同tokens=x*
REM tokens=x,y,m-n 表示提取第x，y列以及第m至第n列。</pre>
<div class="blog_h3"><span class="graybg">示例：获取PID</span></div>
<pre class="crayon-plain-tag">@echo off
REM 这样才能将循环变量%%a赋值给环境变量
setlocal enabledelayedexpansion

title fuckbat

REM 遍历命令结果的2、10列
for /f "delims=, tokens=2,10" %%a in ('tasklist /NH /V /FI "IMAGENAME eq cmd.exe" /FO CSV') do (
REM  将循环变量赋值
    set task_title=title%%b
    set pid=%%a
REM 脱去外部的双引号，用!!的界定符访问变量pid， pid:"= 表示将pid中的"替换为空
    set pid=!pid:"=!
    
REM 如果将标题中的fuckbat替换为空后得到的值与之前不等，说明标题中有fuckbat，说明当前迭代的时当前进程
    if not "!task_title!"=="!task_title:fuckbat=!" (
        echo !pid! &gt; pid.txt
    )
)
endlocal</pre>
<p>&nbsp;</p>
<div class="blog_h2"><span class="graybg">字符串处理</span></div>
<div class="blog_h3"><span class="graybg">字符串替换</span></div>
<p>语法格式：<strong>%a:搜索字符串=替换字符串%</strong>，举例：</p>
<p>&nbsp;</p>
<pre class="crayon-plain-tag">set domain=www.gmem. cc
REM 替换空格为空串，结果：www.gmem.cc
set var=%domain: =%</pre>
<div class="blog_h3"><span class="graybg">字符串截取</span></div>
<p>语法格式：<strong>%a:~[m[,n]]%</strong><br /> a为变量名，m为偏移量（缺省为0），n为截取长度（缺省为全部）</p>
<p>&nbsp;</p>
<div class="blog_h2"><span class="graybg">变量延迟</span></div>
<p>考虑下面的例子：</p>
<pre class="crayon-plain-tag">@echo off 
set a=1 
set a=2 &amp; echo %a%
REM 输出为1

REM 启用变量延迟
setlocal enabledelayedexpansion 
set a=1 
set a=2 &amp; echo !a!
REM 输出为2</pre>
<p>上半部分输出不是2的原因：</p>
<ol>
<li>批处理读取命令时是按行读取的（另外例如for命令等，其后用一对<strong>圆括号闭合的所有语句也当作一行</strong>）</li>
<li>为了能够感知环境变量的动态变化，批处理设计了变量延迟——在读取了一条完整的语句之后，不立即对该行的变量赋值，而会在某个单条语句执行之前再进行赋值</li>
</ol>
<div class="blog_h3"><span class="graybg">使用变量延迟扩展来处理环境变量中的特殊字符</span></div>
<pre class="crayon-plain-tag">@echo off
Setlocal EnableDelayedExpansion
set "VAR=&lt;"
rem 输出：&lt;
echo !VAR!
set "VAR1=value"
echo %VAR1%</pre>
<div class="blog_h1"><span class="graybg">常见问题</span></div>
<div class="blog_h2"><span class="graybg">零散问题</span></div>
<div class="blog_h3"><span class="graybg">如何调用Jar包</span></div>
<pre class="crayon-plain-tag">java -jar .jar</pre>
<div class="blog_h3"><span class="graybg">如何在隐藏窗口中调用BAT脚本？</span></div>
<p>创建VB脚本并调用：</p>
<pre class="crayon-plain-tag">createobject("wscript.shell").run "batch.bat arg1 arg2..." , 0</pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/bat">MS-DOS批处理学习笔记</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/bat/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
