如何在Windows命令行中创建一个空文件?

624
在DOS/Windows命令行中如何创建一个空文件?
我尝试了:
copy nul > file.txt

但它始终显示已复制某个文件。

标准cmd中是否有另一种方法?

应该有一种不需要来自Cygwin或任何其他非标准命令的touch命令的方法。 该命令需要从脚本运行,因此不能使用按键。


刚刚发现一个真正的批处理命令导致生成了一个空文件(0字节):我已更新了我的答案。 - VonC
4
请问需要翻译的内容是:"Duplicate: https://dev59.com/wXVC5IYBdhLWcg3wsTbv, "How to create empty text file from a batch file?". (But, IMHO, the answers are better here.)" ? - Peter Mortensen
是的,执行命令copy nul > file.txt会输出文本“1 file(s) copied.” 但并不会创建一个空文件。 - Ripon Al Wasim
6
对我而言,如果你不能用一个命令创建一个空白文件,这只是证明了MS-DOS很垃圾。 - Kellen Stuart
4
@KolobCanyon:当然可以,就像已经发布的答案一样。但是,您真的认为快速创建空文件应该是面向终端用户并需要在16K RAM中运行的操作系统的优先考虑因素吗?毕竟,在很少的一些特殊情况下,这并不是一件特别有用的事情。 - Harry Johnston
显示剩余3条评论
35个回答

703

没有重定向,Luc VuErik Konstantopoulos指出:这里这里

copy NUL EMptyFile.txt
copy /b NUL EmptyFile.txt

"

"如何从批处理文件中创建空文本文件?" (2008) 也提到了:

"
type NUL > EmptyFile.txt
# also
echo. 2>EmptyFile.txt
copy nul file.txt > nul # also in qid's answer below
REM. > empty.file
fsutil file createnew file.cmd 0 # to create a file on a mapped drive

Nomad提到了一个原始的

C:\Users\VonC\prog\tests>aaaa > empty_file
'aaaa' is not recognized as an internal or external command, operable program or batch file.

C:\Users\VonC\prog\tests>dir

 Folder C:\Users\VonC\prog\tests

27/11/2013  10:40    <REP>          .
27/11/2013  10:40    <REP>          ..
27/11/2013  10:40                 0 empty_file

在同样的精神下,Samuel建议在评论中

我使用的最短的代码基本上与Nomad的代码相同:

.>out.txt

它确实会给出一个错误:

'.' is not recognized as an internal or external command

但这个错误是在stderr中。而>只会重定向stdout,其中没有产生任何输出。
因此需要创建一个文件。
这里可以忽略错误消息。或者,如Rainanswer所述,将其重定向到NUL
.>out.txt 2>NUL

(原始答案,2009年11月)

echo.>filename

"echo """实际上会在文件中放置""!而没有'.'的echo会在文件中放置"Command ECHO activated"。请注意:生成的文件不是空的,但包括一个回车序列:2个字节。"

这个discussion指向了一个真正的批处理解决方案,用于处理一个真正的文件:

 <nul (set/p z=) >filename

 dir filename
 11/09/2009  19:45                 0 filename
 1 file(s)                         0 bytes

"<nul"将一个nul响应传输到set/p命令,这会导致使用的变量保持不变。与set/p通常一样,等号右侧的字符串作为提示显示,没有CRLF。由于这里等号右侧的字符串为空...结果是一个空文件。"
Patrick Cuff的答案中提到的cd. > filename不同的是,这个“重定向位”(<nul...技巧)可以用来输出没有任何CR的行
<nul (set/p z=hello) >out.txt
<nul (set/p z= world!) >>out.txt
dir out.txt

dir 命令应该将文件大小显示为 11 个字节:“helloworld!”。


2
你实际上想要使用 echo.>filename,因为它会包括空格和换行符。 - Agent_9191
1
使用 rem 命令可以避免创建一个空行文件。 - Greg Hewgill
3
不要被这个误导了;看一下下一个答案,它有一个更简单、同样有效的解决方案。第一种情况下所做的部分是错误的(不是空的,但包含换行符),第二种情况则过于复杂。 - Joey
@VonC 做Samuel的建议,.>out.txt只会出现错误“'.'不被识别为内部或外部命令,” - barlop
2
@barlop 是的:这就是重点:它会在 stderr 上触发一些错误消息,但在 stdout 上却是nothing(空字符串)。并且 > 仅将 stdout 重定向到 out.txt。因此创建了一个空文件。在这种情况下,您可以忽略错误消息。 - VonC
显示剩余5条评论

302

试试这个:

type NUL > 1.txt

这一定会创建一个空文件。


这将“NUL is ./NUL”添加到文件中。 - dshgna

182

这是另一种方式:

cd . > filename

3
"cd. > 文件名" 命令会创建一个空文件,否则使用 "cd > 文件名" 命令会在新创建的文件中打印出文件路径。 - niketan
9
使用此命令:cd . > 文件名.扩展名,意思是 cd. 之间需要有一个空格。 - AIon
终于有一个选项没有给我一个丑陋的错误!我简直不敢相信在Windows中没有一个简单的命令来创建文件。他们是怎么忽略这个的呢? - undefined
这是最简单的答案。为什么没有被核对? - undefined

82

如果你真的想要一个完全空的文件,而不产生任何输出到标准输出(stdout),你可以稍微作弊一下:

copy nul file.txt > nul

只需将标准输出重定向到 nul,这样从 copy 命令输出的内容就会消失。


2
如果 file.txt 存在,它会失败。 - Grendler
6
如果文件存在时失败是良好的行为,我理解这个问题是这样的。 - wallyk

62

打开文件:

type file.txt

新建文件:

  • 方法1:type nul > file.txt
  • 方法2:echo 这是一个样本文本文件 > sample.txt
  • 方法3:notepad myfile.txt <按下 Enter>

编辑内容:

notepad file.txt

复制

copy file1.txt file1Copy.txt

改名

rename file1.txt file1_rename.txt

删除文件:

del file.txt

比起使用CTRL + C,将更多内容复制到filename.txt文件中。 - SidPro

50
call>file.txt

这是我知道的最清洁的方法。


2
这里的“干净”是指什么? - GreenAsJade
8
它不会向文件输出任何内容,同时易于记忆和使用。 - cure
它是如何工作的?它使用一个空名称调用脚本(?),结果和可能的副作用是什么(例如标准错误)?难道没有更少晦涩的方法吗?不能使用ZZ代替call吗(虽然这并不比较晦涩)?- 就像Nomad的答案 - Peter Mortensen
它调用了一个不存在的子程序(因为不能有未命名的子程序)。它不会导致错误,你可以通过运行call && echo testcall || echo test来测试。and/or基于前一个命令的错误级别。此外,你引用的答案建议这是更好的解决方案,实际上非常危险。正如其他人在那个答案的评论中已经指出的那样,依赖不存在的命令是可怕的,因为如果它存在,你刚刚运行了它而不知道它做了什么,可能具有比应该有的更多权限。 - cure
@PeterMortensen,底线是,Nomad的答案很危险,调用没有副作用,也不会引发错误。如果你想要一个不那么晦涩的方法,也许可以使用PowerShell或Python或其他任何东西?也许不要去挖掘近十年前关于早已过时的事情的晦涩答案。 - cure

45
echo "" > filename

我相信这在Windows / DOS上可以工作,但我的最后一次实际操作是相当久以前的事了。 我确切地知道它适用于基本上任何符合POSIX标准的操作系统。


2
显然,VonC的回答比我的更好,请给他点赞。 - Kris
5
不幸的是,echo "" 显示双引号并在流被重定向到文件时写入该文件中。同样的情况也会发生在 echo > filename 这种情况下,因为它也会将“ECHO is off/on”写入文件。 - Grendler
也许你可以在创建文件前加上"@echo off"这一行来避免这个问题? - Kris
short and simple. thanks - dev.sochokuchnaya.com

37

在Windows命令行中,一种方法是使用fsutil

fsutil file createnew <filename> <size>

一个例子:

fsutil file createnew myEmptyFile.txt 0

以下内容适用于*nix命令行。

touch filename

这个命令可以更改文件的修改日期,如果文件不存在则创建该文件。


不幸的是,问题明确指出:“没有使用Cygwin的touch命令。” - qid
3
有一些非Cygwin版本的touch命令可以使用:http://unxutils.sourceforge.net/ 是不错的选择。 - Greg Hewgill
在*nix中,我个人偏爱简单的> 文件名,它也可以用于截断现有文件。 - Frank Farmer
fsutil 需要管理员权限,仅仅为了创建一个空文件这有些过分了... - Joey
@Joey,为了创建一个空文件,这些命令都有点过多了吧?即使是下面这个拥有120个点的命令,在你习惯使用touch命令之后也显得很冗长。 - johnny

15
创建任何类型的文件,您可以使用以下代码。
type nul > (file_name).(file_type)
例如,如果你想创建一个文本文件,那么
type nul > demo.txt

如果你想要创建一个 JavaScript 文件,那么

type nul > demo.js

14

你可以编写自己的触摸功能。

//touch.cpp
#include <fstream>
#include <iostream>

int main(int argc, char ** argv;)
{
  if(argc !=2)
  {
    std::cerr << "Must supply a filename as argument" << endl;
    return 1;
  }
  std::ofstream foo(argv[1]);
  foo.close();
  return 0;
}

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