2010-04-28 15 views
10

Estoy intentando escribir un carácter nulo ASCII (nul) en un archivo de una secuencia de comandos de lote de Windows sin éxito. Inicialmente intentado usar echo así:¿Cómo puedo escribir un carácter ASCII nulo (nul) en un archivo con un script por lotes de Windows?

echo <Alt+2+5+6> 

que parece que debería funcionar (tecleando <Alt+2+5+6> en la ventana de comandos sí escribe un carácter nulo - o ^@ tal como aparece), pero echo continuación entrega:

More? 

y se bloquea hasta que presione <Return>. Como alternativa He intentado utilizar:

copy con tmp.txt >nul 
<Alt+2+5+6><Ctrl+Z> 

que hace exactamente lo que necesito, pero sólo si escribo de forma manual en la ventana de comandos. Si lo ejecuto desde un archivo por lotes, se cuelga hasta que presiono <Ctrl+Z>, pero incluso entonces se crea el archivo de salida, pero permanece vacío.

Realmente quiero que el archivo por lotes sea independiente sin requerir (por ejemplo) un archivo separado que contenga un carácter nulo que pueda copiarse cuando sea necesario.

Respuesta

4

Bien, esto fue complicado, y la solución es fea, pero funciona.

Puede usar el archivo por lotes como el archivo que contiene el carácter nulo que se va a copiar.

Este archivo por lotes, llamado null.bat:

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

(donde la última línea contiene sólo el carácter nulo) añade el carácter nulo a myfile.txt.

findstr /v /r muestra todas las líneas que no coinciden con la expresión regular, es decir, solo la última, porque no hay carácter de nueva línea.

He intentado varias otras cosas, pero esta fue la única que pude encontrar que no quitaba el carácter nulo.

Nota:findstr fue enviado por primera vez con Windows 2000 por lo que no puede estar disponible en las versiones anteriores de Windows de

+0

Eso es exactamente lo que necesito, ¡gracias! –

3

Una alternativa a la respuesta aceptada que no implica tener que poner caracteres nulos en el archivo por lotes es de la siguiente manera:

@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% 

Esto es obviamente más prolija y también tiene la desventaja de que no va a funcionar en máquinas Win64 (debido a debug ya no está disponible en estos entornos).

4

Here's an article que describe cómo escribir bytes arbitrarios con un archivo por lotes (busque h2b.com). Esto resuelve eficazmente el problema de escribir cualquier dato no imprimible utilizando un script por lotes (incluido el nulo).

+3

¿Hay alguna solución para Windows de 64 bits? – Mehrdad

4

No me gusta la solución que no puede ser fácil copiar/pegar-d a archivos de texto.Tan pocos más formas:

1) mshta (se pueden utilizar directamente en el archivo por lotes o desde la línea de comandos):

mshta vbscript:execute("CreateObject(""Scripting.FileSystemObject"").GetStandardStream(1).Write(Chr(00)):Close")>testfile 

2) certutil (requiere un archivo temporal)

echo 00>null.hex 
certutil -decodehex null.hex null.bin 

3) makecab sólo echa la subrutina aquí - http://ss64.com/nt/syntax-genchr.html

Cuestiones relacionadas