如何在Windows批处理脚本中将NULL ASCII字符(nul)存储到变量中?

8

在这篇文章(如何使用Windows批处理脚本将空ASCII字符(nul)写入文件?)中,确实有一些方法可以用批处理脚本向文件中写入ASCII NULL字符(nul)。

然而,我没有找到一种方法来将NULL字符存储到变量中。

假设文件null.nil包含一个单独的NULL字符,将其重定向到set /P中似乎不起作用,该变量为空:

< "null.nil" set /P NULL=
set NULL

for /F 看起来也无法工作,因为它似乎会忽略遇到的每个 NULL 字符。依靠相同的文件 null.nil,以下内容将导致变量为空:

for /F %%S in ('type "null.nil"') do set NULL=%%S
set NULL

set语法更改为set "NULL=%%S"set NULL=^%%S并不会改变任何内容,尽管命令行type "null.nil"确实会回显NULL字符(在我的Windows 10 x64机器上; 将type的输出重定向到文件中,并使用十六进制编辑器查看它)。

那么我该如何将变量设置为单个NULL字符?NULL字符可以从文件中获取(例如像null.nil),也可以通过某些巧妙的黑科技生成,但我不希望它直接嵌入到批处理文件中。


4
只是猜测...我认为内部环境变量被处理为以空字符结尾的字符串,由于仅包含空字符的字符串为空(在内容方面没有任何东西),并且将环境变量设置为无效会清除它,因此您在这里可能会遇到问题。 :-) - Ken White
很不幸,你是对的,@KenWhite;我在这里找到了一篇帖子,证实了你的合理怀疑:为特定进程的特定运行设置环境变量 - aschipfl
如果你设法将一个变量设置为单个的 NULL 字符,你如何预见你可以使用该变量? (请注意,这里给出的翻译是简体中文,如果需要繁体中文或其他语言的翻译,请告诉我。) - dxiv
我甚至尝试创建一个Python 3脚本并在环境变量中放置一个NULL字符,但子命令不会接受它:未定义。所以Ken White可能是正确的。这就像尝试在C字符串中放置空字符一样。 - Jean-François Fabre
@dxiv,由于环境变量被存储为以 null 结尾的形式,因此无法读取它们;当我提出问题时,我并不知道存储格式... - aschipfl
为什么要踩?你是不是把否定的回答,比如“这是不可能的”,和踩混淆了? - aschipfl
1个回答

3
根据微软MSDN库的页面环境变量为特定进程的特定运行设置环境变量帖子,环境块存储在以NULL结尾的字符串的NULL结尾块中 - 这里快速说明了EBNF符号:
environment-block = { variable-definition } , null-char ;
variable-definition = variable-name , '=' , variable-value , null-char ;
由于这种存储格式,无法将NULL字符存储到环境变量中。即使设法将NULL写入环境块中,也永远无法再次读取。

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