中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-11 23:49
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [原创]模拟命令行句柄操作(帮助理解句柄复制与备份) 查看 1,028 回复 5
楼 主 [原创]模拟命令行句柄操作(帮助理解句柄复制与备份) 发表于 2009-06-12 11:55 ·  中国 山西 运城 电信
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
22年会员
UID 19350
性别 男
状态 离线
在自己对句柄操作的理解基础上
编写了以下句柄操作模拟代码
大家可以在cmd中挂参数多次运行模拟
看是否符合实际句柄操作后的结果

那么如何判断一个句柄的指向呢
echo 1<&要判定的句柄号 is con
如果显示 con ,那么句柄值为con
否则为nul或者文件

:: 句柄模拟.cmd - 模拟运算句柄操作后的句柄状态
:: qzwqzw - 2009-6-12
@echo off & setlocal EnableDelayedExpansion
if == (
echo. 这是句柄操作示例, 模拟运算进行几次句柄操作后的句柄状态
echo --------------------- call %~n0 "1>&2" "3>nul" ---------------------
call %0 "1>&2" "3>nul" >nul
set 句柄
echo.
echo --------------------- call %~n0 "1>&2" "4>file1.txt" ---------------------
call %0 "1>&2" "4>file1.txt" >nul
set 句柄
echo.
echo --------------------- call %~n0 "1>&2" "5>con" ---------------------
call %0 "1>&2" "5>con" >nul
set 句柄
echo.
pause
goto :eof
)
set "0=con" & set "1=con" & set "2=con"
for %%h in (%句柄%) do set %%h
echo.----- 起始状态 Initiation state -----
for %%h in (0 1 2 3 4 5 6 7 8 9) do set/p=%%h=!%%h! <nul
echo.

echo.----- 预处理 Pre-process -----
:loop
if == goto :end
echo.----- %1 -------
set "_tmp=%~1"
set _句柄=%_tmp:~0,1%
set _句柄_2=
set _dev=
if "%_tmp:~2,1%"=="&" (set _句柄_2=%_tmp:~3%) else (set _dev=%_tmp:~2%)
for %%h in (0 1 2 3 4 5 6 7 8 9) do (
if "!%%h!"=="" (
set/p=b: %_句柄%=^>%%h : <nul
set "%%h=!%_句柄%!"
set bak_%%h=%_句柄%
goto :set
)
)
:set
for %%h in (0 1 2 3 4 5 6 7 8 9) do set/p=%%h=!%%h! <nul
echo.
if defined _dev (
set/p=a: %_dev%=^>%_句柄% : <nul
set %_句柄%=%_dev%
) else if defined _句柄_2 (
set/p=a: %_句柄_2%=^>%_句柄% : <nul
set %_句柄%=!%_句柄_2%!
)
for %%h in (0 1 2 3 4 5 6 7 8 9) do set/p=%%h=!%%h! <nul
echo.
shift
goto :loop

:end
echo.----- 后处理 Post-process -----
for %%h in (0 1 2 3 4 5 6 7 8 9) do (
if not "!bak_%%h!"=="" (
set/p=r: !bak_%%h!^<=%%h : <nul
set !bak_%%h!=!%%h!
set %%h=
set bak_%%h=
for %%h in (0 1 2 3 4 5 6 7 8 9) do set/p=%%h=!%%h! <nul
echo.
)
)
set 句柄=
for %%h in (0 1 2 3 4 5 6 7 8 9) do set 句柄=!句柄! "%%h=!%%h!"
endlocal & set 句柄=%句柄%
echo.----- 结束状态 End Status -----
for %%h in (%句柄%) do set/p=%%~h <nul
echo.


[ Last edited by qzwqzw on 2009-6-13 at 21:12 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
s11ss +15 2009-06-13 12:32
2 发表于 2009-06-13 12:36 ·  中国 北京 联通
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
18年会员
UID 97070
性别 男
状态 离线
那么如何判断一个句柄的指向呢
echo 1&要判定的句柄号 is con
如果显示 con ,那么句柄值为con
否则为nul或者文件


这一段话没看懂
3 发表于 2009-06-13 21:11 ·  中国 山西 运城 电信
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
22年会员
UID 19350
性别 男
状态 离线
更正个键误
echo 1&要判断的句柄号 is con
应该是
echo 1<&要判断的句柄号 is con

它等同于
echo is con 1<&句柄号

举例分析
1<&7

是把句柄7的指向复制给句柄1
而echo 的结果默认是用句柄1输出的
那么如果句柄7指向了con
复制给1后则1也指向con
那么echo的结果会输出在屏幕上
否则不会输出在屏幕上

当然这只是简单判断指向con与非con的办法
具体的办法还需自己再多做测试

[ Last edited by qzwqzw on 2009-6-13 at 21:14 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
s11ss +3 2009-06-14 04:30
4 发表于 2009-06-14 04:32 ·  中国 北京 联通
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
18年会员
UID 97070
性别 男
状态 离线
Originally posted by qzwqzw at 2009-6-13 09:11 PM:
更正个键误
echo 1&要判断的句柄号 is con
应该是
echo 1<&要判断的句柄号 is con

它等同于
echo is con 1<&句柄号

举例分析
1<&7

是 ...


<& 貌似 与 >& 是一样的,都是把后者句柄复制到前者句柄
5 发表于 2009-06-14 21:18 ·  中国 山西 电信
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
22年会员
UID 19350
性别 男
状态 离线
现在发现 >& 与 <& 唯一的区别
就是左值的缺省值
>&的左值缺省值为1
<&的左值缺省值为0
表现出的效果就是在
echo. >nul 3>nul使句柄1为nul后
echo Hello Handle <&2 无输出
echo Hello Handle >&2 有输出
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
s11ss +3 2009-06-14 23:19
6 发表于 2009-06-14 23:11 ·  中国 北京 联通
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
18年会员
UID 97070
性别 男
状态 离线
Originally posted by qzwqzw at 2009-6-14 09:18 PM:
现在发现 >& 与 <& 唯一的区别
就是左值的缺省值
>&的左值缺省值为1
<&的左值缺省值为0
表现出的效果就是在
echo. >nul 3>nul ...

hh ntcmds.chm::/redirection.htm

如果未定义句柄,则默认的 < 重定向输入操作符是 0,而默认的 > 重定向输出操作符是 1。
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
uiopuiop +1 2009-06-15 10:00
论坛跳转: