Board logo

标题: [其他] ascode 应用之 不换行显示字符串 put.com [打印本页]

作者: CrLf    时间: 2012-12-24 02:41     标题: ascode 应用之 不换行显示字符串 put.com

本帖最后由 CrLf 于 2012-12-30 18:08 编辑

其实旧帖中 qzwqzw (以下简称 qzw)也写过不换行输出的 ascode(见 http://bbs.bathome.net/redirect. ... 3&fromuid=30406),但有两个瑕疵:
1、没有对有效的命令行参数长度进行判断,而有效参数总是前缀空格、后缀回车,所以直接从 ds:82 开始获取参数内容的话将显示一个回车符
2、com 解释命令行参数时会忽略头部空格,再附加一个空格到 ds:81 处,所以无法原样输出以空格开头的内容
针对这两个问题,在 qzw 的思路下用自己的办法重写了一下:
  1. @echo off&chcp 437|graftabl>nul 936
  2. echo>put.com PY4`P_W](CX(Cf(Cm(Co2M tvI,t,jPZ,G:F"ubIB5;@C-!-  \\不换行输出字符串
  3. put 同
  4. put 行
  5. put 输
  6. put 出
  7. put ;    建议给参数前缀一个 ; 字符,
  8. put      因为 com 解析参数时会自动忽略头部空格。
  9. pause
复制代码
但由于获取的是命令行参数,而十六位 com 支持的参数长度最长为 122 字节(测试所得 0x7B-1 字节),所以你懂得...若要突破这一限制,需要改成从环境变量或键盘缓冲区获取输入,但是前者工程量太大,后者则有转行为回车换行符吞噬器的倾向——假如用户能够把内容不换行输出到键盘缓冲区,还要 put.com 做什么。

顺便附上 vbs 的近似实现,好处是支持更长的命令行参数以及不需要被迫切换代码页,但好像是不能获取完整参数,所以只判断及显示第一个参数,或许得用 wmi 之类的外部手段获取命令行参数?
  1. @echo off
  2. echo If WSH.Arguments.Count Then WSH.StdOut.Write(WSH.Arguments(0))>put.vbs
  3. ::put.vbs 主体
  4. cscript /nologo put.vbs 1234567
  5. ::调用方式
  6. pause
复制代码
2012/12/30 更新内容:
  1、大幅简化代码,思路更清晰
  2、找到 xp 下致错的原因,修正后效果完美




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2