2010-04-28 47 views
10

Tôi đang cố viết một ký tự null ASCII (nul) vào một tệp từ tập lệnh batch của Windows mà không thành công. Ban đầu tôi cố gắng sử dụng echo như thế này:Làm thế nào tôi có thể viết một ký tự ASCII null (nul) vào một tệp bằng tập lệnh batch của Windows?

echo <Alt+2+5+6> 

mà có vẻ như nó nên làm việc (gõ <Alt+2+5+6> trong cửa sổ lệnh không viết một ký tự null - hoặc ^@ như nó xuất hiện), nhưng echo sau đó kết quả đầu ra:

More? 

và treo cho đến khi tôi nhấn <Return>. Cách khác, tôi đã thử sử dụng:

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

thực hiện chính xác những gì tôi cần nhưng chỉ khi tôi nhập thủ công trong cửa sổ lệnh. Nếu tôi chạy nó từ một tập tin thực thi nó treo cho đến khi tôi bấm <Ctrl+Z> nhưng ngay cả sau đó tập tin đầu ra được tạo ra nhưng vẫn còn trống.

Tôi thực sự muốn tệp lô đứng độc lập mà không yêu cầu (ví dụ) một tệp riêng có chứa ký tự rỗng có thể được sao chép khi cần.

Trả lời

4

Được rồi, điều này rất khó, và giải pháp là xấu, nhưng nó hoạt động.

Bạn có thể sử dụng chính tệp lô làm tệp có chứa ký tự null cần được sao chép.

Tập tin này hàng loạt, được gọi là null.bat:

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

(nơi dòng cuối cùng chứa chỉ các ký tự null) gắn thêm các ký tự null để myfile.txt.

findstr /v /r hiển thị tất cả các dòng không phù hợp với regex, tức là dòng cuối cùng, bởi vì không có ký tự dòng mới.

Tôi đã thử một vài thứ khác, nhưng đây là điều duy nhất tôi có thể tìm thấy mà không loại bỏ ký tự null.

Lưu ý:findstr lần đầu tiên được xuất xưởng với Windows 2000 như vậy có thể không có sẵn trên các phiên bản trước của Windows

+0

Đó chính xác là những gì tôi cần, cảm ơn! –

3

Một thay thế cho câu trả lời chấp nhận mà không liên quan đến việc phải đưa các ký tự null vào tập tin thực thi là như sau:

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

Điều này rõ ràng là tiết hơn và cũng có nhược điểm là nó sẽ không hoạt động trên máy Win64 (do debug không còn là có sẵn trong những môi trường).

4

Here's an article mô tả cách ghi byte tùy ý bằng tệp lô (tìm kiếm h2b.com). Điều này giải quyết một cách hiệu quả vấn đề viết bất kỳ dữ liệu không in nào bằng cách sử dụng một tập lệnh batch (bao gồm cả null).

+3

Có giải pháp nào cho Windows 64 bit không? – Mehrdad

4

Tôi không thích giải pháp không thể dễ dàng sao chép/dán-d vào tệp văn bản.Vì vậy, vài cách hơn:

1) mshta (có thể được sử dụng trực tiếp trong tập tin batch hoặc từ dòng lệnh):

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

2) certutil (yêu cầu một tập tin temp)

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

3) makecab chỉ cần kiểm tra chương trình con tại đây - http://ss64.com/nt/syntax-genchr.html

Các vấn đề liên quan