如何在cmd中精准产生\r\n

admin 2025年2月20日19:50:50评论14 views字数 1627阅读5分25秒阅读模式

2.19 如何在cmd中精准产生rn

http://scz.617.cn:8/windows/202204101414.txt

A: 2022-04-10 14:14

$ (echo | set /p="line 0" & echo= & echo | set /p="line 1") | xxd -g 1
00000000: 6c 69 6e 65 20 30 20 0d 0a 6c 69 6e 65 20 31     line 0 ..line 1

$
 (echo | set /p="line 0" & echo= & echo | set /p="line 1") > any.txt

$
 xxd -g 1 any.txt
00000000: 6c 69 6e 65 20 30 20 0d 0a 6c 69 6e 65 20 31     line 0 ..line 1

"echo="后面有空格时,管道与输出转向均会在rn前面插入空格。

起初我有一个事后证明是错误的假设,以为管道与输出转向的语义一致,所以后续测试均用管道转xxd代替生成文件再xxd,然后在错误的道路上越走越远。

最后测试表明,管道与输出转向的语义居然有不同,这是个坑。

$ (echo|set /p="line 0"&echo=&echo|set /p="line 1") | xxd -g 1
00000000: 6c 69 6e 65 20 30 20 0d 0a 6c 69 6e 65 20 31     line 0 ..line 1

rn前面会插入一个空格

$ (echo|set /p="line 0"&echo=&echo|set /p="line 1") > some.txt

$
 xxd -g 1 some.txt
00000000: 6c 69 6e 65 20 30 0d 0a 6c 69 6e 65 20 31        line 0..line 1

rn前面没有空格

两次测试"echo="后面均无空格,但用管道时,rn前面插入不符合预期的空格。

我在微博提问时为了不引入非自带的xxd,写的是输出转向,犯了"想当然"的错误。先后有两名网友指出,只要"echo="后面不出现空格,用输出转向时rn前面就不会出现空格,他们分别在XP、Win11上测试确认。但由于我已经"想当然"了,在XP、Win7、Win10上测试时均用管道,始终无法消掉非预期的空格,事实上提问之前就测试过"echo="后面无空格的情形。

无论如何,有两个互不相干的网友指出同一种可能,不大可能是OS不同带来的差异。重新在不同版本OS和cmd中反复测试,意外确认管道与输出转向的语义有差异。曾经怀疑是xxd本身的问题,设计新实验排除了这种可能。

(echo|set /p="line 0"&echo=&echo|set /p="line 1") | clip

打开notepad,粘贴剪切板内容,确认使用管道时有非预期空格出现。XP没有clip,Win7、Win10可做该实验。

原始需求是要写入文件的,用xxd只是为了更精确观察字节流,没想到有这种坑等着我。回顾一下,犯了两个"想当然",一是未严格测试就假设管道与输出转向语义一致,二是假设cmd太过成熟,没有版本差异,从而在提问时省略了OS版本描述,这都是反面案例,大家不要学我,引以为戒。

不要用"echo."产生rn,这会导致cmd先去找外部命令echo,会有磁盘I/O。

下面这种古老的搞法也可以精确产生rn

copy /y con some.txt

line 0
line 1^Z

Ctrl-Z表示输入结束

$ xxd -g 1 some.txt
00000000: 6c 69 6e 65 20 30 0d 0a 6c 69 6e 65 20 31        line 0..line 1

原文始发于微信公众号(青衣十三楼飞花堂):如何在cmd中精准产生\r\n

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月20日19:50:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   如何在cmd中精准产生\r\nhttps://cn-sec.com/archives/894984.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息