中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [原创]模拟命令行句柄操作(帮助理解句柄复制与备份)
作者:
标题: [原创]模拟命令行句柄操作(帮助理解句柄复制与备份) 上一主题 | 下一主题
qzwqzw
银牌会员

天的白色影子


积分 2343
发帖 636
注册 2004-3-6
状态 离线
『楼 主』:  [原创]模拟命令行句柄操作(帮助理解句柄复制与备份)

在自己对句柄操作的理解基础上
编写了以下句柄操作模拟代码
大家可以在cmd中挂参数多次运行模拟
看是否符合实际句柄操作后的结果

那么如何判断一个句柄的指向呢
echo 1<&要判定的句柄号 is con
如果显示 con ,那么句柄值为con
否则为nul或者文件
:: 句柄模拟.cmd - 模拟运算句柄操作后的句柄状态
:: qzwqzw - 2009-6-12
@echo off & setlocal EnableDelayedExpansion
if [%1]==[] (
    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 [%1]==[] 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[!%%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%[!%_句柄_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[!%%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 ]

   此帖被 +15 点积分         点击查看详情   
评分人:【 s11ss 分数: +15  时间:2009-6-13 12:32


2009-6-12 11:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 2 楼』:  



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

这一段话没看懂

2009-6-13 12:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2343
发帖 636
注册 2004-3-6
状态 离线
『第 3 楼』:  

更正个键误
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 ]

   此帖被 +3 点积分     点击查看详情   
评分人:【 s11ss 分数: +3  时间:2009-6-14 04:30


2009-6-13 21:11
查看资料  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 4 楼』:  



  Quote:
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

是 ...

<& 貌似 与 >& 是一样的,都是把后者句柄复制到前者句柄

2009-6-14 04:32
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2343
发帖 636
注册 2004-3-6
状态 离线
『第 5 楼』:  

现在发现 >& 与 <& 唯一的区别
就是左值的缺省值
>&的左值缺省值为1
<&的左值缺省值为0
表现出的效果就是在
echo. >nul 3>nul使句柄1为nul后
echo Hello Handle <&2  无输出
echo Hello Handle >&2  有输出

   此帖被 +3 点积分     点击查看详情   
评分人:【 s11ss 分数: +3  时间:2009-6-14 23:19


2009-6-14 21:18
查看资料  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 6 楼』:  



  Quote:
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-6-15 10:00


2009-6-14 23:11
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: