Windows 相当于 Linux 命令“touch”?

fac*_*lmd 210 windows file-attributes touch

当您想在 Windows 上更新文件的日期修改字段时,您使用什么?

  1. 可通过 C++、.NET、C# 或 Windows 原生的东西访问的命令(最好是 Vista)
  2. 工具/应用程序最好是免费的,如果可能的话也是开源的

编辑:正如CheapScotsman here指出的那样,已经有一个应用程序页面。

如果有人知道我如何通过 C++、C#、WSH或类似的东西来做到这一点,很好,否则我认为链接问题中涵盖了其他所有内容。

小智 407

如果要使用 Windows 触摸文件的日期戳,请在命令提示符下使用以下命令:

copy /b filename.ext +,,
Run Code Online (Sandbox Code Playgroud)

filename.ext您的文件名在哪里)。这+,,是一个特殊的标志,copy告诉它简单地更新文件上的日期/时间

* 更改文件的时间和日期

如果要在不修改文件的情况下将当前时间和日期分配给文件,请使用以下语法:

copy /b Source+,,

逗号表示省略了 Destination 参数。

根据 Lumi 和 Justin 的评论进行编辑:将其放入批处理文件中,例如。触摸命令

@COPY /B %1+,, %1
Run Code Online (Sandbox Code Playgroud)

即使文件不在当前目录中(在 Windows 7 上测试),这也有效。

  • 在 Win7 中,如果您不在包含该文件的文件夹中,这将不起作用。它将在当前工作目录中创建一个副本。 (20认同)
  • `type touch.bat` 是 `@echo off` 下一行 `copy /b %1 +,,` - 把它放到 `C:\bin` 或你自己的脚本中,然后你就可以使用它像`touch myfile.txt`。 (16认同)
  • 如果您需要在远程文件夹(UNC 路径)中执行此操作 - 您还必须指定复制命令的目标 - `copy /b Source+,, Source` - 其中 `Source` 包括文件的完整路径 (8认同)
  • `+,,`: http://blogs.msdn.com/b/oldnewthing/archive/2013/07/10/10432879.aspx (8认同)
  • @mob 请注意,这在大文件上并不慢。我在网络驱动器上的 >1GB 文件上使用它,它立即返回(并正常工作)。 (5认同)
  • 如果文件很大,这会很慢。 (4认同)
  • @Jamie:与Win7无关,适用于所有操作系统。您需要位于当前目录中,因为 ,, 将获取没有路径信息的完全相同的文件(请参阅 josmh 评论中的 technet 链接) (2认同)
  • 我创建了一个 [GIST](https://gist.github.com/tjbarbour/6356774) 将此答案与 [this one](http://stackoverflow.com/questions/659647/how-to-get-folder- path-from-file-path-with-cmd) 自动推送/弹出目标目录 (2认同)
  • `如果文件很大,这会很慢。` 实际上,它并不慢,它在不到一秒的时间内完成,甚至不会点亮 HD 访问 LED。很明显,根据 Technet 文章,Windows 中的 `copy` 命令具有专门编码的 `touch` 命令。+1 很棒的发现;我从来不知道这个。 (2认同)
  • @Youda008 - `/b` 告诉 `copy` 文件是二进制文件而不是文本文件。另外,[如 Raymond Chen 所指出](https://devblogs.microsoft.com/oldnewthing/20130710-00/?p=3843),命令末尾的尾随“,,”是多余的。 (2认同)

Gre*_*ill 166

我已经使用并推荐了unxutils,它们是许多常见 Unix 实用程序的本机 Win32 端口。里面有touch命令。

  • 正如几乎所有的 unix-to-windows 端口一样,这无法使用编码集之外的文件名中的 unicode 字符作为非 unicode 程序的默认值。测试文件名会导致所有此类工具失效:`"test тест τεστ.txt"` (6认同)

小智 107

如果您只想更改文件的上次修改日期(这是我的情况):

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于一个文件。对于多个文件:ls * | ForEach-Object {$_.LastWriteTime = Get-Date} (15认同)
  • PowerShell FTW。我的意思是,说真的,unix 很酷,但 PS 更酷。 (11认同)
  • @BrainSlugs83:对代码使用反引号`:`gci -recu -inc "*.*" | % { $_.LastWriteTime = Get-Date }` (7认同)
  • 如果你想递归地做,这很有效: gci -recu -inc "*.*" | % { $_.LastWriteTime = 获取日期 } (3认同)
  • Unix touch 非常棒,因为它很简单。 (2认同)

bob*_*ogo 64

type nul >>file & copy file +,,
Run Code Online (Sandbox Code Playgroud)
  • file如果不存在则创建。
  • 单独保留文件内容。
  • 只使用cmd内置插件。
  • 上次访问时间创建时间均已更新。

更新

嘎!这不适用于只读文件,而适用touch。我建议:

:touch
if not exist "%~1" type nul >>"%~1"& goto :eof
set _ATTRIBUTES=%~a1
if "%~a1"=="%_ATTRIBUTES:r=%" (copy "%~1"+,,) else attrib -r "%~1" & copy "%~1"+,, & attrib +r "%~1"
Run Code Online (Sandbox Code Playgroud)


Far*_*oon 33

@dash-tom-bang:

以下是 Technet 对神秘的“+”和逗号的解释:

复制 /b 源+,,

逗号表示省略了 Destination 参数。

copy 命令支持将多个文件合并为一个目标文件。由于无法在命令提示符下使用空格字符指定空白目标,因此可以使用两个逗号来表示。

这是 Technet 的复制命令参考:http : //technet.microsoft.com/en-us/library/bb490886.aspx

  • 现在这只是搞砸了语法。说真的,*他们在想什么?* 还要注意同样的文档说“目的地:必需。”......我很惊讶。 (17认同)
  • 即使没有逗号,它也对我有用:copy file.ext+ 因此,文档与实际行为相距甚远,因为行为与任何合理的期望相距甚远。 (5认同)
  • 它适用于 Windows Server 2008,但前提是您位于包含该文件的文件夹中 (2认同)

Fre*_*örk 23

如果您想自己编写代码,.NET 提供了File.SetLastAccessTime,File.SetCreationTimeFile.SetLastWriteTime方法。


小智 21

这是使用powershell的递归版本......这将更改所有文件和子目录以及该目录子目录中的文件的最后修改时间

ps c:myDir> Get-ChildItem . * -recurse | ForEach-Object{$_.LastWriteTime = get-date}
Run Code Online (Sandbox Code Playgroud)

  • 不那么冗长,但只使用标准的 Powershell 速记:`ls * -recurse | % { $_.LastWriteTime = Get-Date }` (2认同)

小智 17

我试图在我的批处理脚本中创建一个空文件。你可以使用这个:

ECHO text>file1.txt
Run Code Online (Sandbox Code Playgroud)

  • @Alex 这无关紧要,但 Windows 错误是因为文件以句点开头。在 Windows 资源管理器中有一个奇怪的技巧可以解决这个问题:使文件也以句点结尾。所以输入`.gitignore.`,当你按下回车键时,Windows 会删除尾随句点。疯狂,但它有效。 (5认同)
  • 这是迄今为止最好的快速方法..我只需要创建一个 .gitignore 文件,而 Windows 7 一直在抱怨“必须输入文件名”等等。`echo pie>.gitignore` 效果很好 - 谢谢! (3认同)
  • 但这不会创建一个空文件,file1.txt 中有“文本”。 (3认同)
  • `touch` 不仅用于创建空文件,而且创建空文件也不是OP询问的用法。问题是“当您想要更新文件的日期修改字段时,您会使用什么?”这个答案没有回答这个问题。相反,这个答案回答的问题是:“如何创建一个包含任意文本的文件,如果同名文件已存在,则清除现有内容?”对于最初的问题,这是一个非常具有误导性且可能很危险的答案。 (3认同)

Dav*_*ebb 16

的GnuWin32项目拥有的Unix命令行实用程序在GNU版本的Windows移植。

它作为许多单独的包提供,您可以只安装所需的命令而无需其他依赖项。因为touch你需要CoreUtils包。


ser*_*g10 15

cygwin自带touch。我知道你提到你不想安装整个框架,但 cygwin 非常轻量级,可以从 dos 命令窗口调用,而无需打开整个类似 unix 的命令行。

您还可以控制要安装的工具,因此您可以简单地安装touch.exe文件,而保留框架的其余部分。

  • 就您而言,您只需要安装目录中的 touch.exe 和 cygwin.dll 文件即可使用该工具。没有其他与使用基于 cygwin 的工具相关的依赖项。 (3认同)
  • 当我尝试这个(win7x64)时,除了touch.exe之外,我还需要4个cygwin dll: cygiconv-2.dll cygintl-8.dll cygwin1.dll cyggcc_s-1.dll (2认同)

Jon*_*way 14

这是我编写的一个简单的 regfile,用于在 Windows 资源管理器中添加右键单击“触摸”。编写脚本也很容易,因为它只是调用:

cmd.exe /c copy %1+nul %1 /by
Run Code Online (Sandbox Code Playgroud)


Ada*_*vis 13

许多 unix 命令的本机 win32 端口,包括触摸。

我以前使用过它并且运行良好 - 无需安装,无需 DLL 等


小智 11

CodeProject试试这个。

  • 无需安装。
  • 如果需要,您甚至可以修改源。

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 (2认同)

小智 9

您还可以安装Cygwin,它为您提供 Touch 以及大量其他 *NIX 命令。

  • 没有 cygwin 就不能住在 windows 上。 (2认同)

小智 7

可以将此内容保存到 reg 文件中。这将为所有具有“触摸文件”功能(在 Windows 7 上测试)的文件添加一个右键单击上下文菜单。将以下所有行复制到 reg 文件。运行文件并批准问题。右键单击任何文件(或多个文件) - 现在可以使用“触摸文件”选项。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell]

[HKEY_CLASSES_ROOT\*\shell\Touch File]

[HKEY_CLASSES_ROOT\*\shell\Touch File\command]
@="cmd /C copy /b \"%1\" +,,"
Run Code Online (Sandbox Code Playgroud)


小智 5

有许多 Unix 实用程序的 Windows 端口。查看unxutilsGnuWin32项目。


Den*_*son 5

来自Stack Overflow 上的一个类似问题

为了更新时间戳(忽略 的其他功能touch),我会选择:

copy /b filename.ext +,,
Run Code Online (Sandbox Code Playgroud)


小智 5

在 PowerShell 中尝试:

ni fileName.txt
Run Code Online (Sandbox Code Playgroud)

NI是New-Item cmdlet的别名。