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

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

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

Ответы [ 4 ]

4 голосов
/ 31 января 2015

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

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

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 голосов
/ 05 мая 2010

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

4 голосов
/ 28 апреля 2010

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

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

Этот пакетный файл называется null.bat:

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

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

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

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

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

3 голосов
/ 30 апреля 2010

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

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

...