找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: plp626

【挑战】批处理如何创建仅含一个nul字符的文件

[复制链接]
 楼主| 发表于 2011-5-14 13:01:10 | 显示全部楼层
本帖最后由 plp626 于 2011-5-14 13:40 编辑

15# qzwqzw

这个直接签到bat源代码中,不过要在注释行加转义字符^
  1. ::{^}
  2. @echo off
  3. set/p sub=<%~s0
  4. setlocal EnableDelayedExpansion
  5. set sub=!sub:~4,1!
  6. set/p=!sub!<nul>sub.txt
复制代码
还可借助copy nul的特性,但要生产临时文件,不过很简洁
  1. @copy nul+nul sub.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
zm900612 + 1 哈哈,忘了有这个

查看全部评分

 楼主| 发表于 2011-5-14 13:27:55 | 显示全部楼层
本帖最后由 plp626 于 2011-5-14 13:46 编辑

re: qzwqzw

有个疑问,你14楼的代码为什么要多一行 echoo >nul?
  1. @echo off
  2. (echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=
  3. echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU!WvX0GwUY Wv;ovBX2Gv0ExGIuht6
  4. echo ?@xAyJHmH@=a?}VjuN?_LEkS?`w`s_{OCIvJDGEHtc{OCIKGMgELCI?GGg
  5. echo EL?s?WL`LRBcx=k_K?AxVD?fCo?Cd?BLDs0)>echoo.com
  6. echoo.com $00>null.txt
复制代码
如此也可方便生产0x00字符;

刚才看到15楼的询问,我还以为这个echoo.com 不方便生产0x1a,试了试也可以,不但可以,还可以生产任意"字符流",以至于可以生成我们想要的任何三方工具,非常惊喜!(未考虑速度)
  1. @echo off
  2. (echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=
  3. echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU!WvX0GwUY Wv;ovBX2Gv0ExGIuht6
  4. echo ?@xAyJHmH@=a?}VjuN?_LEkS?`w`s_{OCIvJDGEHtc{OCIKGMgELCI?GGg
  5. echo EL?s?WL`LRBcx=k_K?AxVD?fCo?Cd?BLDs0)>echoo.com
  6. echoo.com $00$1a$0d$0dplp626>test.txt
复制代码
这段神奇的代码让我产生了很大的兴趣,试了试,参数$不紧跟16进制的数据,比如
echoo.com $# 创建的是"-"
echoo.com $$创建 但是"="
而echoo.com $#$$ 又创建的不是"=-" 而是"4#"
这里是怎么对应的?
======================
qzw兄可否把这段代码给大伙讲解下。。。
 楼主| 发表于 2011-5-14 14:06:43 | 显示全部楼层
题外话,我发这个帖子是因为对于ascii码0-255,除了0x00外,我都找到了可以在bat中用变量存放他们并加以利用的方法,可就这个0x00我没办法,

若能0x00可以被利用了,我惊讶的发现,bat 不靠任何外部命令,仅内部命令,便可以生产任何我想要的三方!
这就是我发现的秘密。
只是看来要用到ascode技术,那么人家的方案比我的简洁很多多多。。。

评分

参与人数 1技术 +1 收起 理由
zm900612 + 1 我相信。

查看全部评分

发表于 2011-5-14 14:54:18 | 显示全部楼层
plp的帖子我从此不看
发表于 2011-5-14 15:37:36 | 显示全部楼层
本帖最后由 asnahu 于 2011-5-14 19:40 编辑

qzw 开个专题讲解一下 ascode 吧
发表于 2011-5-14 15:40:53 | 显示全部楼层
plp的帖子我从此不看
523066680 发表于 2011-5-14 14:54

这是为神马...
发表于 2011-5-14 16:47:32 | 显示全部楼层
>仅内部命令,便可以生产任何我想要的三方
不明白怎么实现。。。
exe→转化→批处理可存储的字符→还原→exe
转化和还原仅内部命令可以实现吗?
或者你不是采用这种转换模式?
难道是用echo之类命令直接生成exe文件?
那你exe文件结构的了解不是一般的彻底,那是相当彻底。
拜服。。。
相比之下ascode技术倒没有如此令我惊叹。
发表于 2011-5-14 21:08:19 | 显示全部楼层
本帖最后由 yjstone 于 2011-5-14 22:57 编辑

不好意思,理解错了,还以为是生成一个含nul字符的文件文件呢!
发表于 2011-5-14 21:22:20 | 显示全部楼层
本帖最后由 yjstone 于 2011-5-14 22:59 编辑

学习一下高手的方法,我原来以为 是用ehco.^nul >a.txt呢。
发表于 2011-5-15 11:31:02 | 显示全部楼层
我也一直以为是echo nul>1.txt
原来是空字符文本,中英混合的语法错误,我觉得楼主把nul改成空字符更便于理解。
发表于 2011-5-15 11:36:25 | 显示全部楼层
以下的代码利用外部命令 findstr 达成目的, 但楼主明确要求 不使用任何外部命令,
期待完全符合楼主期望的代码.
  1. >> bin.txt findstr /v /r /c:$ "%~0"
  2. REM statements
  3. REM command...
  4. <only a null charactor>
复制代码
此代码的末行是唯一的一个 null 字符, 若 bin.txt (.txt 扩展名不是必须的)不存在,
将创建仅含一个 null 字符的文件, 否则将一个 null 字符加入到文件的末尾.

这个字符输入方式:
命令行中: (配合 copy con 可保存到新建的文件中)
Ctrl+@
Alt+256 (数字小键盘区, 笔记本可用 Alt+Fn+256 (数字小键区))

notepad++:
输入并选择:
00
"TextFX" -> "TextFX Convert" -> "Convert Hex to text"

小趣发现: 命令行下, 输入 Ctrl+@, 回车, 显示 more? , 再输入 Ctrl+@, 回车, 窗口被关闭.

参考:
http://stackoverflow.com/questions/2730732/how-can-i-write-a-null-ascii-character-nul-to-a-file-with-a-windows-batch-scrip

评分

参与人数 2PB +16 收起 理由
plp626 + 10 回头看次贴,这个信息那是很关键的;
zm900612 + 6 好思路!

查看全部评分

发表于 2011-5-15 21:11:38 | 显示全部楼层
有个疑问,你14楼的代码为什么要多一行 echoo >nul?
是为了防止在不同的语言环境下出现“Invalid keyboard code specified”的错误输出干扰echoo.com的正常输出
主要是针对系统内不存在“英语(美国)”语言的情况
第一次运行echoo.com或其它的16位程序后键盘代码会进行切换
第二次运行不会再有这样的提示

echoo.com $# 创建的是"-"
echoo.com $$创建 但是"="
而echoo.com $#$$ 又创建的不是"=-" 而是"4#"
这里是怎么对应的?

程序固定从$后取两个字符进行计算
如果只跟一个字符则会将回车符0x0d取入合并计算
16进制转10进制算法并不严格检验输入数的合法性
所以会有一些莫名其秒的误差
第三句是取了$#$ 再取$

这段代码仍然是ASCII汇编大师Herbert Kleebauer 的作品
其作品通常只会有Motorola样式汇编源码
与通常我们所学习的Intel样式汇编略有不同
有余力的可以查看以下代码

  1.         @=$178
  2.         move.w  #1,r2           ; write 1 char
  3.         move.w  r2,r3           ; to stdout
  4.         move.w  #buf,r1         ; write buffer
  5.         move.w  r1,r6
  6.         move.w  #$80,r5

  7.         movu.bw (r5.w),r4       ; cmdline length
  8. _30:    inc.w   r5
  9.         dec.w   r4
  10.         bmi.b   _100            ; at least 1 byte
  11.         cmp.b   #' ',(r5.w)
  12.         beq.b   _30
  13.         
  14. _10:    move.b  (r5.w),r0       ; next byte from cmdline
  15.         inc.w   r5
  16.         move.b  r0,(r6.w)
  17.         cmp.b   #',r0
  18.         bne.b   _20
  19.         move.b  (r5.w),r0
  20.         inc.w   r5
  21.         bsr.w   hex2bin
  22.         move.b  (r5.w),r0
  23.         inc.w   r5
  24.         bsr.w   hex2bin
  25. _20:    move.b  #$40,m0
  26.         trap    #$21
  27.         dec.w   r4
  28.         bpl.b   _10
  29. _100:   rts.w

  30. hex2bin:
  31.         or.b    #$20,r0
  32.         sub.b   #'a'-10,r0
  33.         bpl.b   _10
  34.         add.b   #'a'-10-'0',r0
  35. _10:    lsl.b   #4,(r6.w)
  36.         add.b   r0,(r6.w)
  37.         dec.w   r4
  38.         rts.w
  39. buf:   
复制代码

评分

参与人数 1技术 +1 收起 理由
plp626 + 1 非常感谢

查看全部评分

发表于 2011-5-18 02:48:15 | 显示全部楼层
本帖最后由 caruko 于 2011-5-18 02:49 编辑

copy con a.txt
然后输入 ctrl+z

想了一下,可以这样  copy nul a.txt
debug a.txt
d100 发现全0
发表于 2011-5-18 02:53:35 | 显示全部楼层
呃,copy nul 原来有了。
回复没翻页没看到。
发表于 2011-5-18 02:57:58 | 显示全部楼层
本帖最后由 caruko 于 2011-5-18 10:28 编辑

不过,变量赋值为00这个16进制字符,使用它会提示变量没有定义。
一般 set "x=",表示销毁X变量, 除非利用DEBUG,更改变量表中的数据。

制作了一个  0077   2个字节的文本。
notepad打开只看到一个w。
type 输出可以看到w前有一个空格。
但是set /p=<nnn.txt,跟for 提取都提取不到。

试试,type输出,然后复制出来的

  1. ^

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 23:03 , Processed in 0.023542 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表