标题: [原创]模拟命令行句柄操作(帮助理解句柄复制与备份)
[打印本页]
作者: qzwqzw
时间: 2009-6-12 11:55
标题: [原创]模拟命令行句柄操作(帮助理解句柄复制与备份)
在自己对句柄操作的理解基础上
编写了以下句柄操作模拟代码
大家可以在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 ]
作者: s11ss
时间: 2009-6-13 12:36
Quote: |
那么如何判断一个句柄的指向呢
echo 1&要判定的句柄号 is con
如果显示 con ,那么句柄值为con
否则为nul或者文件 |
|
这一段话没看懂
作者: qzwqzw
时间: 2009-6-13 21:11
更正个键误
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 ]
作者: s11ss
时间: 2009-6-14 04:32
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
是 ... |
|
<& 貌似 与 >& 是一样的,都是把后者句柄复制到前者句柄
作者: qzwqzw
时间: 2009-6-14 21:18
现在发现 >& 与 <& 唯一的区别
就是左值的缺省值
>&的左值缺省值为1
<&的左值缺省值为0
表现出的效果就是在
echo. >nul 3>nul使句柄1为nul后
echo Hello Handle <&2 无输出
echo Hello Handle >&2 有输出
作者: s11ss
时间: 2009-6-14 23:11
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。