ChatGPT解决这个技术问题 Extra ChatGPT

在 windows 的命令行上创建一个空文件(如 linux touch 命令)

在 Windows 机器上,我收到此错误

'touch' 不是内部或外部命令、可运行程序或批处理文件。

我正在关注这些似乎是特定于 linux 的 instructions,但在标准的 Windows 命令行上它不能像这样工作:

touch index.html app.js style.css

是否有与 linux / mac os / unix world 中的“touch”命令等效的 windows ?为了实现这种命令,我是否需要手动创建这些文件(并修改它们以更改时间戳)?我正在使用节点,这似乎不是很......节点式......

simple Google search 向您展示了 touch 的许多 Windows 实现。此处的其他讨论:superuser.com/questions/10426/…Cygwin library 是 Windows 上 Unix 命令的常用工具集。
如果您在使用 PowerShell 时登陆此处,请直接跳转到 Raghuveer's answer

K
Kamyab

在 cmd 之类的 Windows 命令行上替换 touch 命令的一种简单方法是:

type nul > your_file.txt

这将在 your_file.txt 文件中创建 0 个字节。

这也是在 Windows 批处理文件中使用的一个很好的解决方案。

另一种方法是使用 echo 命令:

echo.> your_file.txt

回声。 - 将创建一个包含一个空行的文件。

如果您需要保留文件的内容,请使用 >> 而不是 >

>   Creates a new file
>>  Preserves content of the file

例子

type nul >> your_file.txt

您也可以使用 call 命令。

在不停止父批处理程序的情况下从另一个批处理程序调用。 call 命令接受标签作为调用的目标。

例子:

call >> your_file.txt

--- 或者即使您不想让它变得困难,您也可以安装 Windows Subsystem for Linux (WSL)。然后,键入。

wsl touch

或者

wsl touch textfilenametoedit.txt

不需要报价。


在 Windows 7 上,第一个选项会产生一个可怕的对话框,然后您会在控制台中看到 access denied。第二个选项工作得很好!
答案是错误的,它仅在文件不存在时才有效。如果文件存在,使用 >> 第一个不执行任何操作,第二个在文件末尾添加一行。正确答案是superuser.com/questions/10426/…
@stenci - 我只是在一个不存在的文件上尝试过它,它工作得很好。它创建了文件确定。也许您缺乏管理员权限?
@stenci 超级用户链接很棒。您应该将其发布为答案。
@DeniseSkidmore 谢谢,我添加了答案。它很深,人们更有可能阅读我对这个答案的评论而不是我的答案,但现在它就在那里。
M
MC ND

Windows 本身不包含 touch 命令。

您可以使用任何可用的公共版本,也可以使用您自己的版本。将此代码另存为 touch.cmd 并将其放置在路径中的某个位置

@echo off
    setlocal enableextensions disabledelayedexpansion

    (for %%a in (%*) do if exist "%%~a" (
        pushd "%%~dpa" && ( copy /b "%%~nxa"+,, & popd )
    ) else (
        type nul > "%%~fa"
    )) >nul 2>&1

它将遍历它的参数列表,并且对于每个元素,如果它存在,则更新文件时间戳,否则,创建它。


这是最好的,完全按预期工作......这里的其他解决方案确实有效,但留下警告/错误文本,IDK 如果那是我独有的。
A
Aaron Clark

你可以使用这个命令:ECHO >> filename.txt

它将在当前文件夹中创建一个具有给定扩展名的文件。

更新:

对于空文件,请使用:复制 NUL filename.txt


更好的 type NUL > filename(创建一个 0 字节的文件)
像触摸一样,如果文件存在,这不会覆盖文件:type NUL >> filename
这是添加“ECHO 已开启”的好方法。到你的文件。
这不会更新现有文件的时间戳。
我认为丹尼斯斯基德莫尔是在回应 henon,而不是 OP。 (我赞同她的评论。)
s
stenci

答案是错误的,它仅在文件不存在时才有效。如果文件存在,使用第一个什么都不做,第二个在文件末尾添加一行。

正确答案是:

copy /b filename.ext +,,

我在这里找到它:https://superuser.com/questions/10426/windows-equivalent-of-the-linux-command-touch/764721#764721


当文件不存在时,此答案不起作用。 (CMD 产生错误。)
这是一个很好的解决方案......文件不存在很容易通过“如果文件存在......”来解决
R
Raghuveer

在 Windows Power Shell 上,您可以使用以下命令:

New-Item <filename.extension>

或者

New-Item <filename.extension> -type file

注意:New-Item 可以用它的别名 ni 代替


这是当今 Windows 世界的真正答案,其中 PowerShell 是默认的命令外壳程序。
不确定您指的是什么 Windows,我刚刚安装了新的 Windows 10,而 Powershell 绝对不是默认 shell。 'New-Item' is not recognized as an internal or external command
这是 Windows 7 上 PowerShell 5 的最佳答案。
您可能希望为现有文件添加 -ErrorAction SilentlyContinue,这样它就不会在现有文件上出错。
k
kayleeFrye_onDeck

我很惊讶这里有多少答案只是错误。在文件中不回显任何内容将用 ECHO is ON 之类的内容填充文件,并且尝试将 $nul 回显到文件中实际上会将 $nul 放入文件中。此外,对于 PowerShell,将 $null 回显到文件中实际上不会生成 0kb 文件,而是编码为 UCS-2 LE BOM 的内容,如果您需要确保文件没有字节顺序标记,这可能会变得混乱。

在这里测试所有答案并参考一些类似的答案后,我可以保证这些将在每个控制台 shell 中工作。只需将 FileName.FileExtension 更改为您想要 touch 的文件的完整路径或相对路径;感谢 Keith RussellCOPY NUL FILE.EXT 更新:

带有时间戳更新的 CMD

copy NUL FileName.FileExtension

这将创建一个新文件,命名为您放置的任何内容,而不是 FileName.FileExtension,大小为 0 字节。如果文件已经存在,它将基本上就地复制自身以更新时间戳。我想说这比使用 touch 的 1:1 功能更像是一种解决方法,但我不知道有任何 CMD 内置工具可以在不更改任何其他内容的情况下更新文件的时间戳。

不带时间戳更新的 CMD

if not exist FileName.FileExtension copy NUL FileName.FileExtension

带有时间戳更新的 Powershell

if (!(Test-Path FileName.FileExtension -PathType Leaf)) {New-Item FileName.FileExtension -Type file} else {(ls FileName.FileExtension ).LastWriteTime = Get-Date}

是的,它将作为单线在控制台中工作;无需将其放在 PowerShell 脚本文件中。

不带时间戳更新的 PowerShell

if (!(Test-Path FileName.FileExtension -PathType Leaf)) {New-Item FileName.FileExtension -Type file}


文件存在的情况,你想将它的修改时间戳更新为当前时间呢?我不明白这些例子是如何实现的。
伟大的观察,RoG!我已经更新了解决这个问题的答案:)
这是最好的答案。但是,我仍然会通过将 fsutil file CreateNew FileName.FileExtension 0 替换为 copy NUL Filename.FileExtension 来改进它,因为后者更短并且做同样的事情。
@KeithRussell IIRC 有一个特定的原因我没有使用 copy 而不是 fsutil 但已经有一段时间了......我很确定这就是我了解 fsutil 的方式哈哈!我会试着找出原因...
即使它们的行为确实相同,我想我现在说一个更好,没有速度测试还为时过早。
O
Ofer Haber

在命令行上使用以下命令:

fsutil file createnew filename  requiredSize

参数信息如下:

fsutil - 文件系统实用程序(您正在运行的可执行文件)

文件 - 触发文件操作

createnew - 要执行的操作(创建一个新文件)

文件名 - 就是文件名

requiredSize - 将在创建的文件中分配文件大小(以字节为单位)


需要一些解释才能被认为是一个体面的答案。目前尚不清楚这五个词的含义。
为我工作... requiredSize 的东西很奇怪...该命令只是用数千个 NULLs 填充您的新文件...很奇怪...所以只需使用 0 ...如果您跳过所需尺寸...
这个commnad需要管理员权限:(
touch 还会更新现有文件的时间戳,而不仅仅是创建新文件。
touch 是一种快速的方法,最接近它的是 echo 或 type,我猜,虽然这是一个非常方便的脚本工具,并且在 WS16 中广泛使用,竖起大拇指! docs.microsoft.com/en-us/windows-server/administration/…
m
maxspan

在你的机器上安装 npm

在命令提示符下运行以下命令。

npm install touch-cli -g

现在您将能够使用 touch cmd。


nodejs 开发人员会喜欢你的回答
“-我应该如何运送我的小猫...-公民...首先购买跨大西洋...然后...继续!!!”的缩影;-)))
K
Keldon Alleyne

您可以使用以下命令复制 touch 的功能:

$>>filename

它的作用是尝试执行名为 $ 的程序,但如果 $ 不存在(或者不是产生输出的可执行文件),则它不会产生任何输出。它本质上是对功能的破解,但是您将收到以下错误消息:

'$' 不是内部或外部命令、可运行程序或批处理文件。

如果您不想要错误消息,那么您可以执行以下两项操作之一:

type nul >> filename

或者:

$>>filename 2>nul

type 命令尝试显示 nul 的内容,它什么都不做,只是在读取时返回一个 EOF(文件结尾)。

2>nul 将错误输出(输出 2)发送到 nul(写入时忽略所有输入)。显然,第二个命令(带有 2>nul)被 type 命令变得多余,因为它可以更快地键入。但至少你现在有了选择和知识。


这很好,但它总是将 %ERRORLEVEL% 设置为非零。您可以通过附加 noop || cd. 来解决该问题,但这总是将错误设置为 0,如果“触摸”失败,这可能不是您想要的。
n
navarq

如前所述

echo >> index.html

它可以是任何文件,任何扩展名然后做

notepad index.html

这将在记事本编辑器中打开您的文件


O
Oliver Schafeld

在 Windows Powershell 终端中模拟 Unix/Mac OS X 的“触摸”命令不需要任何命令(typeecho)。只需使用以下速记:

$null > filename

这将在您当前位置创建一个名为“文件名”的空文件。使用您可能需要的任何文件扩展名,例如“.txt”。

来源:https://superuser.com/questions/502374/equivalent-of-linux-touch-to-create-an-empty-file-with-powershell(见评论)


您好像错过了echo
Windows cmd 中的@sabithpocker, $null 不存在,并且由于它不存在,因此不会产生任何输出。您 $null > filename 将该空输出发送到 filename(如果您发现我的想法)。
@sabithpocker 在 Windows Powershell 中,它可以在没有 echo 的情况下工作。在标准命令行终端 (cmd) 中,您需要 echo。对困惑感到抱歉。
@OliverSchafeld 和 Keldon 谢谢你的解释。
这会将 BOM 添加到文件中。
E
Enora

从 Windows 10 上的 Visual Code Studio 终端,这对我来说是创建一个新文件的方法:

type > hello.js
echo > orange.js
ni > peach.js

r
rbento

对于一个非常简单的 touch 版本(主要用于在当前目录中创建一个 0 字节文件),另一种方法是创建一个 touch.bat 文件并将其添加到 %Path% 或将其复制到 { 4} 目录,如下所示:

触摸.bat

@echo off
powershell New-Item %* -ItemType file

创建单个文件

C:\Users\YourName\Desktop>touch a.txt

    Directory: C:\Users\YourName\Desktop

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2020-10-14  10:28 PM              0 a.txt

创建多个文件

C:\Users\YourName\Desktop>touch "b.txt,c.txt"

    Directory: C:\Users\YourName\Desktop

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2020-10-14  10:52 PM              0 b.txt
-a----        2020-10-14  10:52 PM              0 c.txt

适用于 PowerShell 和命令提示符。

适用于现有子目录。

如果文件已经存在,则不创建:

New-Item : The file 'C:\Users\YourName\Desktop\a.txt' already exists.

对于多个文件,仅创建不存在的文件。接受以逗号分隔的文件名列表,不带空格或在需要空格时用引号括起来:

接受以逗号分隔的文件名列表,不带空格或在需要空格时用引号括起来:

C:\Users\YourName\Desktop>touch d.txt,e.txt,f.txt
C:\Users\YourName\Desktop>touch "g.txt, 'name with spaces.txt'"

d
delliottg

您还可以在 Windows 命令窗口 (cmd.exe) 中使用 copy con [filename]

C:\copy con yourfile.txt [enter]
C:\CTRL + Z [enter] //hold CTRL key & press "Z" then press Enter key.
^Z
    1 Files Copied.

这将在本地目录中创建一个名为 yourfile.txt 的文件。


u
user1880531

我使用 cmder(命令行模拟器)

它允许您在 Windows 机器内运行所有 Linux 命令。

它可以从 https://cmder.net/ 下载

我很喜欢


win10打开Cmder时出现“Unknown Publisher”警告是怎么回事?真可惜。
J
Jon Crowell

正如 Raghuveer 在他/她的 answer 中指出的那样,niNew-Item 的 PowerShell 别名,因此您可以使用 ni 而不是 touch 从 PowerShell 提示符创建文件。

如果您更喜欢键入 touch 而不是 ni,则可以将 touch 别名设置为 PowerShell New-Item cmdlet。

在 Windows PowerShell 中创建触摸命令:

在 PowerShell 提示符下,定义新别名。

Set-Alias -Name touch -Value New-Item

现在 touch 命令的工作方式几乎与您预期的一样。唯一的区别是您需要用逗号分隔文件列表。

touch index.html, app.js, style.css

请注意,这仅设置 PowerShell 的别名。如果您不喜欢 PowerShell,您可以设置 WSL 或在 Windows 上使用 bash。

不幸的是,一旦您结束 PowerShell 会话,别名就会被遗忘。要使别名永久化,您必须将其添加到您的 PowerShell 用户配置文件中。

从 PowerShell 提示符:

notepad $profile

将您的别名定义添加到您的配置文件并保存。


U
Uri Ziv

如果您的 PC 中安装了 Cygwin,您可以简单地使用为 touch 提供的可执行文件(也可以通过 windows 命令提示符):

C:\cygwin64\bin\touch.exe <file_path>

我通常用于集成 linux 命令的解决方案...我的杀手级命令是 grep... ;-)
A
Anoop Kumar Narayanan

假设文件存在并且您只需要更新时间戳。

type test.c > test.c.bkp && type test.c.bkp > test.c && del test.c.bkp

R
Royi Namir

最短的香草解决方案是:

.>myfile.txt

https://i.stack.imgur.com/0lLsn.png

您将收到错误消息,但文件已创建:

https://i.stack.imgur.com/E4TlJ.png


J
Joshua

使用 rem. > file.txt(注意附加到命令“rem”的点)
这会创建一个空文件


W
Wade

如果您使用的是 VS Code,有一个 command line tool code 可以帮助您在 VS Code 中打开一个不存在的文件。


A
Amedee Van Gasse

所有其他答案都缺少一些东西。 Linux touch 命令有一个 -t 选项,可让您将上次修改时间设置为任意日期和时间,而不仅仅是当前时间。

这会将 filename.txt 的修改日期设置为 2012 年 12 月 20 日午夜后 30 分钟。

touch -t 201212210030 filename.txt

要在 Windows 中获得等价物,您需要在 PowerShell 中,不能在 Cmd 中完成。

更改名为 filename.txt 的文件的创建日期/时间戳:

(Get-Item "D:\Test\filename.txt").CreationTime=("21 December 2012 00:30:00")

更改名为 filename.txt 的文件的最后写入日期/时间戳:

(Get-Item "D:\Test\filename.txt").LastWriteTime=("21 December 2012 00:30:00")

更改名为 filename.txt 的文件的最后访问日期/时间戳:

(Get-Item "D:\Test\filename.txt").LastAccessTime=("21 December 2012 00:30:00")

K
Kevin Kirsten Lucas

使用 PowerShell,键入:ni index.htmlni style.cssni app.js

ni <filename>.<extension>

T
Thiago Maciel

简单,以txt文件为例

echo $null >> filename.txt

$null 添加到文件中。
M
Matheus Cuba

是的,你可以使用 Node for Touch 我只是使用它,它在 windows Cmd 或 gitbash 中运行良好

https://i.stack.imgur.com/tX2tH.png


我没有对此投反对票,但我会解释为什么会这样。这个问题被标记为 [cmd],这意味着 OP 想要一个对 CMD 开箱即用的答案,这意味着没有不包含默认 Windows 安装的命令行实用程序。这将排除几乎所有脚本语言,甚至包括 CScript、WScript 和 PowerShell 等内置 Windows 脚本语言。关键不是它可以在 CMD 环境中工作,而是任何有权访问 CMD 的人都可以使用,不包括权限问题。