代码之家  ›  专栏  ›  技术社区  ›  Matthew Murdoch

如何使用windows批处理脚本将空ascii字符(nul)写入文件?

  •  10
  • Matthew Murdoch  · 技术社区  · 16 年前

    我试图从windows批处理脚本向文件写入ascii空字符(nul),但没有成功。我最初试着用 echo 这样地:

    echo <Alt+2+5+6>
    

    看起来应该有用(打字 <Alt+2+5+6> 在命令窗口中写入空字符-或 ^@ 但是 回声 然后输出:

    More?
    

    一直挂到我按下 <Return> . 作为另一种选择,我尝试使用:

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

    这正是我所需要的,但只有当我在命令窗口中手动键入它。如果我从批处理文件运行它,它将挂起,直到我按 <Ctrl+Z> 但即使这样,输出文件也会被创建,但仍然是空的。

    我真的希望批处理文件独立,而不需要(例如)一个包含空字符的单独文件,该文件可以在需要时复制。

    4 回复  |  直到 11 年前
        1
  •  4
  •   Matthew Murdoch    16 年前

    好吧,这很棘手,解决方案也很难看,但它确实有效。

    可以将批处理文件本身用作包含要复制的空字符的文件。

    此批处理文件名为 null.bat :

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

    (最后一行包含 只有空字符 )将空字符附加到 myfile.txt .

    findstr /v /r 显示所有与regex不匹配的行,即只显示最后一行,因为没有换行符。

    我尝试过其他一些方法,但这是唯一一个没有去掉空字符的方法。

    注: findstr 最初随Windows 2000一起提供,因此在以前版本的Windows上可能不可用

        2
  •  4
  •   Matthew Murdoch    16 年前

    Here's an article 它描述了如何使用批处理文件写入任意字节(搜索 h2b.com )这有效地解决了使用批处理脚本(包括null)编写任何不可打印数据的问题。

        3
  •  4
  •   npocmaka    11 年前

    我不喜欢无法轻松将d复制/粘贴到文本文件的解决方案。所以没有其他方法:

    1) MSHTA (可以直接在批处理文件中使用,也可以从命令行使用):

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

    2) 蜡膏 (需要临时文件)

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

    3) 马克卡 检查一下这里的子程序- http://ss64.com/nt/syntax-genchr.html

        4
  •  3
  •   Joey Gumbo    16 年前

    不需要在批处理文件中输入空字符的可接受答案的替代方法如下:

    @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 在这些环境中不再可用)。