Как я могу записать нулевой символ ASCII (nul) в файл с пакетом Windows script?

Я пытаюсь написать нулевой символ ASCII (nul) в файл из пакета Windows script без успеха. Сначала я попытался использовать 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>, но даже тогда выходной файл будет создан, но останется пустым.

Я действительно хочу, чтобы командный файл стоял отдельно, не требуя (например) отдельного файла, содержащего нулевой символ, который можно копировать при необходимости.

Ответ 1

Хорошо, это было сложно, и решение было уродливым, но оно работает.

Вы можете использовать файл пакета как файл, содержащий нулевой символ, который нужно скопировать.

Этот командный файл, называемый null.bat:

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

(где последняя строка содержит только нулевой символ) добавляет нулевой символ к myfile.txt.

findstr /v /r показывает все строки, которые не соответствуют регулярному выражению, т.е. только последний, поскольку символ новой строки отсутствует.

Я пробовал несколько других вещей, но это был единственный, который я смог найти, который не разделил нулевой символ.

Примечание. findstr была впервые отправлена ​​с Windows 2000, поэтому может быть недоступна в предыдущих версиях Windows

Ответ 2

Здесь статья, в которой описывается, как писать произвольные байты с командным файлом (искать h2b.com). Это эффективно решает проблему записи любых непечатаемых данных с помощью пакета script (включая null).

Ответ 3

Мне не нравится решение, которое не может быть легко скопировано/вставить в текстовые файлы. Несколько способов:

1) mshta​​strong > (может использоваться непосредственно в пакетном файле или из командной строки):

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

Ответ 4

Альтернативой принятому ответу, который не требует наличия пустых символов в пакетном файле, является следующее:

@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 больше не будет доступен в этих средах).