【问题标题】:Create an empty file on the commandline in windows (like the linux touch command)在 windows 的命令行上创建一个空文件(如 linux touch 命令)
【发布时间】:2015-07-12 17:24:30
【问题描述】:

在 Windows 机器上出现此错误

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

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

touch index.html app.js style.css

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

【问题讨论】:

标签: windows batch-file cmd command-line


【解决方案1】:

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

fsutil file createnew filename  requiredSize

参数信息如下:

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

file - 触发文件操作

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

filename - 就是文件名

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

【讨论】:

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

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 如果那是我独有的。
【解决方案3】:

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

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

更新:

对于空文件使用:copy NUL filename.txt

【讨论】:

  • 更好的type NUL > filename(创建一个0字节的文件)
  • 和touch一样,如果文件存在,这不会覆盖文件:type NUL >> filename
  • 这是添加“ECHO 已开启”的好方法。到您的文件中。
  • 这不会更新现有文件的时间戳。
  • 我认为 Denise Skidmore 是在回应 henon,而不是 OP。 (我赞同她的评论。)
【解决方案4】:

在 Windows 命令行(如 cmd)上替换 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 谢谢,我添加了答案。它很深,人们更有可能阅读我对这个答案的评论而不是我的答案,但现在它就在那里。
【解决方案5】:

您也可以在 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 的文件。

【讨论】:

    【解决方案6】:

    没有命令——typeecho——都不是在 Windows Powershell 终端中模拟 Unix/Mac OS X 的“触摸”命令所必需的。只需使用以下简写:

    $null > filename
    

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

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

    【讨论】:

    • 你好像错过了echo
    • @sabithpocker 在 Windows cmd 中,$null 不存在,并且由于它不存在它不会产生任何输出。你 $null > filename 将那个空输出发送到 filename (如果你发现我的想法)。
    • @sabithpocker 在 Windows Powershell 中,它可以在没有 echo 的情况下工作。在标准命令行终端 (cmd) 中,您需要 echo。很抱歉造成混乱。
    • @OliverSchafeld 和 Keldon 谢谢你的解释。
    • 这会将 BOM 添加到文件中。
    【解决方案7】:

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

    $>>filename
    

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

    '$' 未被识别为内部或外部命令, 可运行的程序或批处理文件。

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

    type nul >> filename
    

    或者:

    $>>filename 2>nul
    

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

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

    【讨论】:

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

    简单,以txt文件为例

    echo $null >> filename.txt
    

    【讨论】:

    • $null 添加到文件中。
    【解决方案9】:

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

    正确答案是:

    copy /b filename.ext +,,
    

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

    【讨论】:

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

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

    【讨论】:

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

    如前所述

    echo >> index.html
    

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

    notepad index.html
    

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

    【讨论】:

      【解决方案12】:

      在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 的最佳答案。
      【解决方案13】:

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

      在这里测试了所有答案并参考了一些类似的答案后,我可以保证这些将在每个控制台 shell 中工作。只需将FileName.FileExtension 更改为您想要touch 的文件的完整路径或相对路径;感谢Keith Russell COPY 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 的方式哈哈!我会试着找出原因......
      • 即使它们的行为相同,我想我现在说一个更好,没有速度测试还为时过早。
      【解决方案14】:

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

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

      【讨论】:

      • 我通常用于集成 linux 命令的解决方案...我的杀手级命令是 grep... ;-)
      【解决方案15】:

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

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

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

      真的很喜欢

      【讨论】:

      • 当我尝试在 win10 中打开 Cmder 时出现“未知发布者”警告是怎么回事?无赖。
      【解决方案16】:

      假设文件存在,你只需要更新时间戳。

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

      【讨论】:

        【解决方案17】:

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

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

        【讨论】:

          【解决方案18】:

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

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

          在 Windows PowerShell 中创建 touch 命令:

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

          Set-Alias -Name touch -Value New-Item
          

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

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

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

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

          从 PowerShell 提示符:

          notepad $profile
          

          将您的别名定义添加到您的个人资料并保存。

          【讨论】:

            【解决方案19】:

            对于一个非常简单的touch 版本,它主要用于在当前目录中创建一个 0 字节文件,另一种方法是创建一个touch.bat 文件并将其添加到%Path% 或复制它到C:\Windows\System32 目录,像这样:

            touch.bat

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

            创建单个文件

            C:\Users\YourName\Desktop>touch a.txt 目录:C:\Users\YourName\Desktop 模式 LastWriteTime 长度 名称 ---- ------------- ------ ---- -a---- 2020-10-14 10:28 PM 0 a.txt

            创建多个文件

            C:\Users\YourName\Desktop>touch "b.txt,c.txt" 目录:C:\Users\YourName\Desktop 模式 LastWriteTime 长度 名称 ---- ------------- ------ ---- -a---- 2020-10-14 10:52 PM 0 b.txt -a---- 2020-10-14 10:52 PM 0 c.txt

            还有

            • 适用于 PowerShell 和命令提示符。
            • 适用于现有子目录。
            • 如果文件已存在则不创建:
            新项目:文件 'C:\Users\YourName\Desktop\a.txt' 已经存在。
            • 对于多个文件,仅创建不存在的文件。
              • 接受逗号分隔的文件名列表,不带空格或在需要空格时用引号括起来:
            C:\Users\YourName\Desktop>touch d.txt,e.txt,f.txt C:\Users\YourName\Desktop>touch "g.txt, 'name with spaces.txt'"

            【讨论】:

              【解决方案20】:

              在你的机器上安装 npm

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

              npm install touch-cli -g
              

              现在你可以使用 touch cmd了。

              【讨论】:

              • nodejs 开发者会喜欢你的回答
              • “-我应该如何运送我的小猫...-公民...首先购买跨大西洋...然后...继续!!!”的缩影;-)))
              猜你喜欢
              • 2010-12-14
              • 1970-01-01
              • 1970-01-01
              • 2019-12-17
              • 1970-01-01
              • 2019-05-13
              • 1970-01-01
              • 1970-01-01
              • 2012-11-03
              相关资源
              最近更新 更多