2010-04-28 10 views
10

Sto tentando di scrivere un carattere null ASCII (nul) in un file da uno script batch di Windows senza esito positivo. Inizialmente ho provato ad utilizzare echo simili:Come posso scrivere un carattere ASCII null (nul) in un file con uno script batch di Windows?

echo <Alt+2+5+6> 

che sembra che dovrebbe funzionare (digitando <Alt+2+5+6> nella finestra di comando se scrive un carattere nullo - o ^@ come appare), ma echo poi uscite:

More? 

e si blocca fino a quando non si preme <Return>. Come alternativa Ho provato ad utilizzare:

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

che fa esattamente quello che mi serve, ma solo se di tipo manualmente nella finestra di comando. Se lo eseguo da un file batch, si blocca finché non premo <Ctrl+Z> ma anche in questo caso il file di output viene creato ma rimane vuoto.

Desidero davvero che il file batch sia autonomo senza richiedere (ad esempio) un file separato contenente un carattere null che può essere copiato quando necessario.

risposta

4

Ok, questo è stato difficile, e la soluzione è brutta, ma funziona.

È possibile utilizzare il file batch stesso come file contenente il carattere null da copiare.

Questo file batch, chiamato null.bat:

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

(dove l'ultima riga contiene solo il carattere nullo) aggiunge il carattere null a myfile.txt.

findstr /v /r mostra tutte le linee che non corrispondono alla regex, vale a dire solo l'ultima, perché non c'è carattere di fine riga.

Ho provato diverse altre cose, ma questo è stato l'unico che ho trovato che non ha spogliato il carattere null.

Nota:findstr fu primo fornito con Windows 2000 in modo potrebbe non essere disponibile per le versioni precedenti di Windows

+0

Questo è esattamente ciò di cui ho bisogno, grazie! –

3

Un'alternativa alla risposta accettata che non comporta dover mettere i caratteri null nel file batch è come segue:

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

Questo è ovviamente più dettagliato e ha anche l'inconveniente che non funziona su macchine Win64 (a causa di debug non essere più disponibile in tali ambienti).

4

Here's an article che descrive come scrivere byte arbitrari con un file batch (ricerca di h2b.com). Questo risolve efficacemente il problema di scrivere qualsiasi dato non stampabile usando uno script batch (incluso null).

+3

Esiste una soluzione per Windows a 64 bit? – Mehrdad

4

Non mi piace la soluzione che non può essere facilmente copia/incolla a file di testo.Così alcuni altri modi:

1) mshta (possono essere utilizzati direttamente in file batch o da linea di comando):

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

2) certutil (richiede un file temporaneo)

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

3) makecab basta controllare la subroutine qui - http://ss64.com/nt/syntax-genchr.html

Problemi correlati