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

asc*_*pfl 8 windows null ascii batch-file

关注帖子如何使用Windows批处理脚本将空ASCII字符(nul)写入文件?确实有一种方法可以使用批处理脚本将ASCII NULL字符(nul)写入文件.

但是,我找不到将NULL字符存储到变量的方法.

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

< "null.nil" set /P NULL=
set NULL
Run Code Online (Sandbox Code Playgroud)

for /F似乎没有工作,因为它似乎解雇它遇到的每个NULL字符.依赖于同一个文件null.nil,以下结果为空变量:

for /F %%S in ('type "null.nil"') do set NULL=%%S
set NULL
Run Code Online (Sandbox Code Playgroud)

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

那么如何将变量设置为单个NULL字符?NULL字符可以从文件中获取(如null.nil)或由某些智能黑客生成,但我不希望它直接嵌入批处理文件中.

asc*_*pfl 3

根据Microsoft 的 MSDN 库的环境变量页面以及为特定进程的特定运行设置环境变量后,环境块存储在以 NULL 结尾的字符串的 NULL 结尾块中 - 这里快速在EBNF中进行说明符号:

environment-block = { variable-definition } , null-char ;
variable-definition = variable-name , '=' , variable-value , null-char ;
Run Code Online (Sandbox Code Playgroud)

由于这种存储格式,不可能将 NULL 字符存储到环境变量中。即使有人设法将 NULL 写入环境块,也无法再次读取它。