本帖最后由 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 的思路下用自己的办法重写了一下:- @echo off&chcp 437|graftabl>nul 936
- echo>put.com PY4`P_W](CX(Cf(Cm(Co2M tvI,t,jPZ,G:F"ubIB5;@C-!- \\不换行输出字符串
- put 同
- put 行
- put 输
- put 出
- put ; 建议给参数前缀一个 ; 字符,
- put 因为 com 解析参数时会自动忽略头部空格。
- pause
复制代码 但由于获取的是命令行参数,而十六位 com 支持的参数长度最长为 122 字节(测试所得 0x7B-1 字节),所以你懂得...若要突破这一限制,需要改成从环境变量或键盘缓冲区获取输入,但是前者工程量太大,后者则有转行为回车换行符吞噬器的倾向——假如用户能够把内容不换行输出到键盘缓冲区,还要 put.com 做什么。
顺便附上 vbs 的近似实现,好处是支持更长的命令行参数以及不需要被迫切换代码页,但好像是不能获取完整参数,所以只判断及显示第一个参数,或许得用 wmi 之类的外部手段获取命令行参数?- @echo off
-
- echo If WSH.Arguments.Count Then WSH.StdOut.Write(WSH.Arguments(0))>put.vbs
- ::put.vbs 主体
-
- cscript /nologo put.vbs 1234567
- ::调用方式
-
- pause
复制代码 2012/12/30 更新内容:
1、大幅简化代码,思路更清晰
2、找到 xp 下致错的原因,修正后效果完美 |