WScript.Shell的AtEndOfStream在程序存活时访问会阻塞.

4 篇文章 0 订阅
1 篇文章 0 订阅

下面的代码是使用这个控件运行cmd.exe;

并读取出cmd.exe的初始信息;

但是按常理来理解,应该使用cmd.StdOut.AtEndOfStream来判断是否已经读取完stdout流了,也就是指针是否指向尽头了.

但是测试中却发现,这个方式根本不能使用,一使用,当cmd.exe的status == 0时,就会导致整个hta阻塞,不反应了;

这时就必须关闭启动出来的cmd.exe,hta才能恢复.

所以,目前能想到的方法就是判断已经到了最一个字符就停止读取.

而上面的判断是否到了结束应该是用在status=1时.这时访问这个值时,就能正常;

但是对于使用来说,这样做意义不大,我的本意是想使用hta来实现一个比较人性华的cmd输入接口,可惜目前看来有点麻烦.


cmd.hta测试代码


<!DOCTYPE html>
<html>
<head>
<HTA:APPLICATION INNERBORDER="no" SCROLL="no"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
body{padding:0px;margin:0px;width:100%;height:100%;text-align:center;}
#home{width:95%;border:1px solid gray;padding:2px;}
#cmdInput{width:95%;height:200px;border:1px solid gray;padding:5px;overflow:auto;}
#screen{width:95%;height:200px;overfolw:auto;space-white:nowrap;border:1px solid gray;padding:5px;}
</style>
</head>
<body id="body">
<div>
<input id="home" title="当前目录"/>
<textarea id="cmdInput">
s = open('about:blank');
s.document.write('<' + 'textarea οnkeypress="if (event.keyCode==10)eval(this.value);">'+'<' + '/textarea>');
s.opener = window;
</textarea>
</div>
<div>
<p><a href="#1" id="cls">清屏</a></p>
<textarea id="screen"></textarea>
</div>
<script>
var wsh = new ActiveXObject("WScript.Shell");
var cmd = null;
runCmd();
cmdOut();

window.onload = function () {
}

function cmdOut() {
    var out = '';
    clearInterval(window.cmdOuter);
    window.cmdOuter = setInterval(function(){
        if (cmd && (!cmd.Status) && (!cmd.StdOut.AtEndOfStream)) {
            var c = cmd.StdOut.read(1);
            out += c;
            document.title= c;
            
            if (c.indexOf('>') > -1) {
                clearInterval(window.cmdOuter);
                screenShow(out);
            }
        } else {
            clearInterval(window.cmdOuter);
            screenShow(out);            
        }
    }, 1);    
}

function runCmd() {
    if ( (!cmd) || cmd.Status) cmd = wsh.Exec('%comspec% /c cmd.exe');
}

function stopCmd() {
    if (cmd && (!cmd.Status) ) cmd.Terminate(); 
}

function screenShow(str) {
    _('screen').value += str;
}

_('cmdInput').onkeypress = function () {
    switch(event.keyCode) {
        case 10://ctrl+enter
            eval(this.value);
            break;
    }
}
function _(id) {
    return document.getElementById(id);
}

_('cls').onclick = function () {
    _('screen').value = '';
}
</script>

</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值