如何使用Windows批处理脚本向文件写入空ASCII字符(NUL)?

12

我试图从Windows批处理脚本中写入ASCII空字符(nul)到文件,但没有成功。我最初尝试使用echo命令,像这样:

echo <Alt+2+5+6>

这个方法看起来应该是可行的(在命令窗口中输入<Alt+2+5+6>确实会写入一个空字符,或者出现^@),但是echo却输出:

More?

当我按下 <Return> 之前,程序会挂起。作为替代方案,我尝试使用以下代码:

copy con tmp.txt >nul
<Alt+2+5+6><Ctrl+Z>

它正好做我需要的事情,但仅当我在命令窗口手动输入时才有效。如果我从批处理文件中运行它,它会挂起直到我按下<Ctrl+Z>,但即使如此,输出文件也会被创建但保持为空。

我真的希望批处理文件可以独立运行,而不需要(例如)一个单独的文件包含空字符,该文件可以在需要时复制。

5个回答

5

好的,这个有点棘手,但解决方案很丑陋,但是它有效。

你可以使用批处理文件本身作为要复制的空字符文件。

这个批处理文件叫做null.bat

findstr /v /r \n null.bat >> myfile.txt
[NULL]

myfile.txt文件的末尾添加了空字符,最后一行仅包含空字符

findstr /v /r 显示所有未与正则表达式匹配的行,即最后一行,因为没有换行符。

我尝试了其他几种方法,但这是我找到的唯一不会剥离空字符的方法。

注意: findstr 最初随Windows 2000一起发布,因此可能在之前的Windows版本中不可用。


5
我不喜欢那种不能轻松复制/粘贴到文本文件的解决方案。还有几种方法:
1)mshta(可以直接在批处理文件或命令行中使用):
mshta vbscript:execute("CreateObject(""Scripting.FileSystemObject"").GetStandardStream(1).Write( Chr(00) ):Close")>testfile

2)certutil(需要一个临时文件)
echo 00>null.hex
certutil -decodehex null.hex null.bin

3) makecab 只是在此处检查子程序 - http://ss64.com/nt/syntax-genchr.html


1
#1 是一个很好的解决方案。另外,将 > 替换为 >> 可以追加到现有文件中。 - mythofechelon

4
这里有一篇文章介绍如何使用批处理文件(搜索 h2b.com)编写任意字节,有效解决了使用批处理脚本(包括空值)写入任何不可打印数据的问题。请参考:这篇文章

3
有没有适用于64位Windows的解决方案? - user541686

3

另一种不需要在批处理文件中放置空字符的替代方法如下:

@echo off

set NULL_FILE=null.txt
set DEBUG_COMMANDS=write-null.dbg

echo e 100 >%DEBUG_COMMANDS%
echo 0 >>%DEBUG_COMMANDS%
echo n %NULL_FILE% >>%DEBUG_COMMANDS%
echo rbx >>%DEBUG_COMMANDS%
echo 0 >>%DEBUG_COMMANDS%
echo rcx >>%DEBUG_COMMANDS%
echo 1 >>%DEBUG_COMMANDS%
echo w >>%DEBUG_COMMANDS%
echo q >>%DEBUG_COMMANDS%

debug < %DEBUG_COMMANDS% >nul

del %DEBUG_COMMANDS%

这显然更冗长,而且有一个缺点是它不适用于Win64机器(由于在这些环境中debug不再可用)。


2
创建大小为<size>的空文件:
fsutil file createnew <file> <size>

但这是对另一个问题的答案。文件大小为0与文件中的NUL字符是两回事。 - jeb
这个问题要求在文件中写入一个“null字符(nul)”,而不是文件大小为0。文件中的NUL字符大小为1。OP并不想要“包含可在需要时复制的空字符的单独文件”,例如genchr.cmd或类似情况。 - Zimba
你说得对,我之前没有理解“创建大小为<size>的空文件”的正确含义。 - jeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接