Как я могу записать нулевой символ 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) mshtastrong > (может использоваться непосредственно в пакетном файле или из командной строки):
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
больше не будет доступен в этих средах).