Я пытаюсь записать нулевой символ 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>
но даже затем выходной файл создается, но остается пустым.
Я действительно хочу пакетный файл к одинокому, не требуя (например), отдельного файла, содержащего нулевой символ, который может быть скопирован при необходимости.
Хорошо, это было сложно, и решение уродливое, но оно работает.
Вы можете использовать сам командный файл как файл, содержащий нулевой символ, который нужно скопировать.
Этот командный файл с именем null.bat
:
findstr /v /r \n null.bat >> myfile.txt
[NULL]
(где последняя строка содержит только нулевой символ ) добавляет нулевой символ к myfile.txt
.
findstr / v / r
показывает все строки, которые не соответствуют регулярному выражению, т.е. только последнюю, потому что нет символа новой строки.
Я пробовал еще несколько вещей, но это был единственный способ, который не удалял нулевой символ.
Примечание. findstr
впервые поставлялся с Windows 2000, поэтому может быть недоступен в предыдущих версиях Windows
Альтернативой принятому ответу, который не требует добавления нулевых символов в пакетный файл, является следующее:
@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
больше не доступен в этих средах).
Вот статья, в которой описывается, как записывать произвольные байты с помощью пакетного файла (поиск по h2b.com
). Это эффективно решает проблему записи любых непечатаемых данных с помощью пакетного сценария (включая null).