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

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

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

4 ответов


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

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

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

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

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

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

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

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


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


мне не нравится решение, которое не может быть простым копированием / вставкой-d в текстовые файлы.Так что еще несколько способов:

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


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

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