批处理之符号篇--句柄

这篇接着聊句柄,也只是初步的介绍与理解,句柄深究起来其实很深奥~~。

在上篇我们提到过句柄的概念:输入或输出数据流的位置被称为句柄,句柄的英文是handle,在英文中有操作、处理、控制之类的意义。
句柄是一个用来标识对象或项目的标识符,可以用来描述窗体、文件等,由于Windows系统的内存管理机制,即虚拟地址经常变动,系统用句柄来记载数据地址的变更。

重定向常用句柄:0,1,2(0和1通常可省略),未定义句柄:3-9

- 批处理句柄0: 指在批处理文件中使用的一个特殊的文件句柄,它表示标准输入(stdin)。批处理句柄0可以用来从键盘或重定向的文件中读取数据。
- 批处理句柄1:表示标准输出(stdout),用来向屏幕或重定向的文件中写入数据。
- 批处理句柄2:表示标准错误(stderr),用来向屏幕或重定向的文件中写入错误信息。
- 批处理句柄3-9:表示其他的文件句柄,可以用来打开、读取或写入文件。

标准输入、输出、错误

stdin 标准输入 0

stdout 标准输出 1

stderr 标准错误输出 2

图示:




句柄的用途不仅限于重定向输入输出,还可以用于打开或关闭文件或设备,传递参数,调用子程序,获取环境变量等。

因此,可以把批处理句柄看成是一种在批处理文件中引用或传递命令行参数的技术。它的原理是使用特殊的符号(如%0,%1,%2等)来代表批处理文件本身或者它所接收的参数(符号)。

我们可以使用这些句柄来传递参数给批处理文件或者访问环境变量的值。这样,批处理文件就可以根据不同的输入来执行不同的操作。

变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示。

例如,假设有一个名为hello.bat的批处理文件,它的内容是:

@echo off
echo Hello, %0!
echo Hello, %1!
echo Hello, %2!
echo Hello, %3!
echo Hello, %4!
echo Hello, %19!
pause>nul

如果我们在命令行中输入hello.bat 111 222 333 444 555,那么批处理文件就会输出:

Hello, hello.bat!
Hello, 111!
Hello, 222!
Hello, 333!
Hello, 444!
Hello, 1119!

如果在批处理文件里,写成如下的内容,执行后,输出不变:
call hello.bat 111 222 333 444 555
pause>nul


这里,%0就是一个批处理文件句柄,它表示批处理文件本身的名称。%1也是一个句柄,它表示批处理文件的第1个参数,%2是第二个参数,依此类推。


这里的%是一个批处理特殊字符,批处理特殊字符是一些在批处理文件中具有特殊含义或功能的字符。它们通常需要用引号或转义符来表示它们的字面意义,如果没有引号或转义符一般表示其特殊含义。


如: %用于表示变量或参数--%表示变量用于cmd窗口,%%表示变量用于批处理文件;表示参数,%后加0-9数字,例如%1表示第一个参数,%date%表示引用当前日期,等等,后面我们还会讲到%var%和!var!的用法区别。

参数的用法类似于正则的\n--匹配第n个标记子表达式匹配的内容,其中n是1到9之间的数字。如下面的这段代码中的\1:
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('dir /a-d /b /s temp\*.txt') do (set c=%%~nxa&set str2=!c:~2,4!
for /r "temp" %%i in (%%~nxa) do if exist %%i sed -i "/keywords/s/^\(.............................................................\)..../\1!str2!/" "%%i")
pause

思考:
1.如果执行hello.bat,会输出什么?
2.如果在批处理文件结尾加&& del %0 >nul 2>nul有什么作用?(注意执行前备份批处理文件,%0不要写成0%)

举报
评论 0