如何从批处理文件中创建空文本文件?

282

有人能记得在MSDOS中使用BAT文件创建空文件的命令吗?


3
同样在https://dev59.com/wHI-5IYBdhLWcg3wu7FU上,“如何在命令行中创建一个空文件?” - Peter Mortensen
6
你不会混淆DOS和cmd.exe吧? - user unknown
请阅读:Set-Content "your_file.txt" .gitignore -Encoding utf8,这是区分大小写的,并强制使用UTF8编码!(我还将其发布为答案)。 - Wolfpack'08
这个回答解决了你的问题吗?如何在Windows命令行中创建一个空文件? - malat
13个回答

405
copy NUL EmptyFile.txt

DOS有一些特殊文件(实际上是设备),它们存在于每个目录中,NUL是UNIX的/dev/null的等价物:它是一个神奇的文件,总是为空,并且会丢弃任何你写入它的东西。这里是一份其他一些特殊文件列表CON也偶尔有用。

为了避免任何输出,你可以使用:

copy /y NUL EmptyFile.txt >NUL

/y防止copy在输出到NUL时询问你看不见的问题。


37
+1 - 这个问题明确指出了一个“空”文件,因此已接受的答案是错误的。 - Joe
10
DannySmurf的解决方案实际上创建了一个空文件——一个换行符会被输出到标准输出,没有任何内容被输出到标准错误流(被重定向到新文件)。不过还是谢谢你的点赞。 - ephemient
2
type nul > EmptyFile.txt 是最短的解决方案。但你的答案比被接受的解决方案更好,因为你的文件将真正为空。+1 - TPAKTOPA
4
警告:是的,问题是如何创建一个空文件,但通常您想要“确保文件存在”。当使用copy /Y NUL命令时,它可能会擦除现有内容。如果您习惯于Unix的touch命令,则这可能与您的期望完全不同。在这方面,使用type NUL >> emptyfile.txt更安全。 - eckes
@Sinjai CON 是控制台,详见 https://en.wikipedia.org/wiki/Device_file#DOS,_TOS,_OS/2,_and_Windows。 - ephemient
显示剩余4条评论

253
echo. 2>EmptyFile.txt

这将重定向输出流2 (stderr) 到一个文件。命令echo不会输出任何东西到stderr,所以文件变成空的。

普通的echo也可以工作,但是echo.更好,因为它不会打印无用和可能混淆的消息ECHO is on.


50
这会向标准输出打印一个换行符,但是我的回答没有。 - ephemient
7
有时这很相关;我曾经留下了一些无用的文件,直到我想到可以通过复制 NUL(或输入“type NUL>文件名”)来创建一个大小为 0 字节的文件 :-) - Joey
20
将ephemient的回答和这个回答合并,你可以执行以下命令:"echo. >NUL 2>EmptyFile.txt",以达到相同的结果而不输出换行符。 - cmptrgeekken
8
为什么 echo. 中要有 .?这个 . 是为了指定命令的执行路径。在Windows系统中,执行一个命令时,系统会按照一定的顺序搜索当前目录以及系统环境变量中定义的路径来查找该命令的可执行文件。如果直接输入 echo ,系统会首先在当前目录中查找是否存在 echo.exe 文件,如果没有找到,则继续在环境变量中定义的路径中查找。而如果输入的是 echo. ,则表示明确指定了当前目录作为执行路径,因此系统会直接在当前目录中查找 echo.exe 文件并执行。 - Ninh Pham
3
如果您使用echo 2而没有加上.,控制台将显示“ECHO关闭”。使用echo. 2可以通过仅显示换行符来有效地静音控制台输出。 - OneManBand
显示剩余7条评论

204
type NUL > EmptyFile.txt

在阅读了前两篇文章之后,我得出了这两者的结合。它看起来更加简洁。不需要像之前的文章那样将“1 file(s) copied.”消息重定向到NUL,并且它与通常会在批处理文件中跟随的ECHO OutputLineFromLoop >> Emptyfile.txt很搭配。


16
+1 这是最自然的想法,而不是通过 stderr 等其他手段来制造结果。 - Amit Naidu
4
你说得对。这种方法避免了在复制命令中使用 /y 标志。 - djangofan
简短而容易。这里还有一些其他的解决方案不会创建一个零字节的新文件! - Christian St.
1
这应该是被接受的答案。非常干净和简单。 - cbmeeks

81
我从其他答案中收集的技巧:
使用生成0字节文件的方法非常明确,向后兼容:
type nul >EmptyFile.txt

这段文字的大意是:
“灵感来源于:匿名, Danny Backett, 以及可能还有其他人,我自己受到了JdeBP工作的启发。 另一种0字节文件的方式,看起来是向后兼容的。”
REM. >EmptyFile.txt

通过思路来源: 约翰内斯

第三种方式的0字节文件,看起来也是向后兼容的:

echo. 2>EmptyFile.txt

通过:TheSmurf 的想法

一种系统化的零字节文件可能自Windows 2000以来就可用:

fsutil file createnew EmptyFile.txt 0

通过Emm的想法:

覆盖只读文件的0字节文件

ATTRIB -R filename.ext>NUL
(CD.>filename.ext)2>NUL

通过想法:copyitright

单个换行符(2个字节:0x0D 0x0A十六进制表示, 或者写成\r\n):

echo.>AlmostEmptyFile.txt

注意:在echo.>之间不要有空格。

灵感来自:如何在批处理文件中回显换行符?


编辑:似乎任何无效的命令重定向到一个文件都会创建一个空文件。嘿,这是一个特性!兼容性:未知。
TheInvisibleFeature <nul >EmptyFile.txt

一个0字节的文件:无效命令/带有随机名称(兼容性:未知):
%RANDOM%-%TIME:~6,5% <nul >EmptyFile.txt

通过:Hung Huynh的随机 来源 编辑2:Andriy M 指出 最有趣/引人注目的方式可能是通过无效命令实现。 一个0字节的文件:无效命令/时髦的方式(兼容性:未知)
*>EmptyFile.txt

思路来源:Andriy M 一种即将推出的0字节文件方式:
break > file.txt

通过 foxidrive 的思路,感谢 Double Gras评论

实际上应该是 type nul ...,而不是 type <nul ... - Andriy M
@AndriyM 谢谢,你是对的,我已经进行了编辑!没注意到这点,因为有趣的是它可以与错误的命令一起工作。这可能意味着任何无效的命令重定向到一个文件名将创建一个空文件!我刚刚尝试了 NonExistentCommand <nul >EmptyFile.txt,它发挥了作用。 - n611x007
有趣。至于随机命令名称生成,这可能是不必要的,您可以使用 *>EmptyFile.txt 或任何包含高度不可能成为名称一部分的字符的“命令”。尽管我承认,未来总会存在微小的风险,它变成一个有效的命令。 - Andriy M
2
又来一个:break > file.txt,感谢 foxidrive - Gras Double
4
如果您需要“必须存在但不应被截断”,则大多数命令都可以使用>>(就像Unix的touch命令一样)。 - eckes
显示剩余2条评论

27

REM. > empty.file


我卡在Windows CE上,这是唯一一个创建空文件的答案!其他方法要么添加一个空行,要么根本不起作用... - AntonyG
这个解决方案唯一的问题是,如果当前目录中有一个名为 REM 的文件,并且您键入 REM.,cmd 将响应 "'rem.' 不是内部或外部命令,也不是可运行的程序或批处理文件。" - DodgyCodeException
@DodgyCodeException,使用rem/代替rem.可以解决这个问题... - aschipfl
@aschipfl 谢谢,这很有趣。同样有趣的是,这个2010年的答案的评论之间相隔了几年。一次缓慢的对话! - DodgyCodeException

10

如果写入的文件可能已经存在且为只读状态,请使用以下代码:

ATTRIB -R filename.ext
CD .>filename.ext
如果文件不存在,只需执行以下操作:
CD .>filename.ext

(根据DodgyCodeException的评论更新/更改了代码)

为了抑制可能出现的任何错误:

ATTRIB -R filename.ext>NUL
(CD .>filename.ext)2>NUL

1
这个解决方案唯一的问题是,如果当前目录中有一个名为“CD”(没有扩展名)的文件,并且您键入“CD.”,cmd 将响应“'CD.' 不是内部或外部命令,也不是可运行的程序或批处理文件。” 如果您改为键入 CD .(在点之前加上空格),它将正常工作。 - DodgyCodeException

9

又来一本书——打字简短而简单。

break>file.txt
break>"file with spaces in name.txt"

我猜我们可以跳过引号。 - Nam G VU
@NamGVU 引号用于目标文件名,如果您选择使用长的文件名元素,如空格或&等。它们不是文件内容的一部分。 - foxidrive
是的,我同意 ^^ 如我们所讨论的那样,请允许我更新您的内容。 - Nam G VU
@NamGVU 引号可以保留,无论文件名长短。我猜如果从命令行键入短文件名,那么您不希望输入不必要的内容。 - foxidrive
我建议从这个答案中删除第二行。在我看来,这是目前为止最好的答案,但第二行除非那些不了解命令行空格处理基础知识的人使用它,否则并没有什么价值。 - kayleeFrye_onDeck
最佳答案是原样,虽然我很想了解break语句的背景,因为我正在反向工程一个旧的批处理文件,但我找到的只是“如何暂停”,当寻找这个语句的含义时。可能是从类似这样的答案得到的。 - Barreto

7
fsutil file createnew file.cmd 0

FSUTIL 工具需要管理员权限。 - DodgyCodeException
fsutil不是MS-DOS中的标准实用程序。 - Bernhard Eriksson

2

有无数种方法。

不输出任何内容的命令:

break
cls
color
goto
pushd
popd
prompt
title

奇怪的命令:
CD.
REM.
@echo off
cmd /c
START >FILE

过时的print命令会产生一个空文件:
print /d:EMPTY_TEXT_FILE nul

2
您可以使用TYPE命令代替COPY命令。请尝试以下操作:
TYPE File1.txt>File2.txt

File1.txt 为空时。


3
你可以执行 type NUL>File2.txt - Danny Beckett
7
顺便问一下,如何获取File1.txt文件? - TomeeNS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接