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

Я пытаюсь записать нулевой символ ASCII (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> но даже затем выходной файл создается, но остается пустым.

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

10
задан Matthew Murdoch 28 April 2010 в 15:12
поделиться

3 ответа

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

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

Этот командный файл с именем null.bat :

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

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

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

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

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

4
ответ дан 3 December 2019 в 22:35
поделиться

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

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

3
ответ дан 3 December 2019 в 22:35
поделиться

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

4
ответ дан 3 December 2019 в 22:35
поделиться