【问题标题】:Windows equivalent of the Linux command 'touch'?Windows 等效于 Linux 命令“触摸”?
【发布时间】:2010-09-08 06:18:46
【问题描述】:

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

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

编辑: 正如CheapScotsman here 所指出的,已经有一个申请页面。

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

【问题讨论】:

标签: windows file-attributes touch


【解决方案1】:

如果您想使用 windows 触摸文件的日期戳,请在命令提示符处使用以下命令:

copy /b filename.ext +,,

(其中filename.ext 是您的文件名)。 +,,copy 的一个特殊标志,告诉它只是 update the date/time on the file

* 更改文件的时间和日期

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

copy /b Source+,,

逗号表示省略了Destination参数。

根据 Lumi 和 Justin 的 cmets 进行编辑: 将其放入批处理文件中,例如。 touch.cmd

@COPY /B %1+,, %1

即使文件不在当前目录中也可以使用(在 Windows 7 上测试)。

【讨论】:

  • type touch.bat@echo off 和下一行copy /b %1 +,, - 把它放到C:\bin 或者你自己的脚本中,然后你可以像touch myfile.txt 一样使用它。跨度>
  • 在 Win7 中,如果您不在包含该文件的文件夹中,这将不起作用。它将在当前工作目录中创建一个副本。
  • @mob 请注意,这在大文件上并不慢。我在网络驱动器上的 >1GB 文件上使用了它,它立即返回(并且有效)。
  • 如果您需要在远程文件夹(UNC 路径)中执行此操作 - 您还必须指定复制命令的目标 - copy /b Source+,, Source - 其中 Source 包括文件的完整路径
【解决方案2】:

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

【讨论】:

  • 几乎所有的 unix-to-windows 端口都无法使用编码集之外的文件名中的 unicode 字符作为非 unicode 程序的默认值。测试文件名会触发每个此类工具:"test тест τεστ.txt"
  • gnuwin32 有它。但实际上,gnuwin32 对于 unicode 字符也失败了。
  • 2017 年更新在 Windows 10 中,我们可以使用 Windows 的 Linux 子系统,它会安装 bash。不需要 cygwin、MinGW、unxutils 或任何其他部分 unix 到 windows 端口。 docs.microsoft.com/en-us/windows/wsl/install-win10
  • @Davos 你有没有在你的(通常是非特权的)用户上下文之外的任何文件上尝试过这个?因为从技术上讲,LXSS 的用户区是作为非特权用户运行的。
  • 如今,安装代码签名包Git for Windows 并从那里使用touch 确实更容易,因为无论如何您都可以在任何(NT)用户上下文中使用它,而您的建议将您完全限制在启动 WSP 应用程序的用户所拥有的文件和文件夹中(或者至少那些只能通过设置适当的 ACE 以修改时间戳进行访问的文件和文件夹)。出于同样的原因,上述端口也应该可以工作。您使用 WSL 的方法只能在 WSL 沙箱的约束内工作......
【解决方案3】:

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

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date

【讨论】:

  • PowerShell FTW。我的意思是,说真的,unix 很酷,但 PS 更酷。
  • 这仅适用于一个文件。对于多个文件:ls * | ForEach-Object {$_.LastWriteTime = Get-Date}
  • 如果你想递归地做,这很好用: gci -recu -inc "." | % { $_.LastWriteTime = 获取日期}
  • @BrainSlugs83:对代码使用反引号`:gci -recu -inc "*.*" | % { $_.LastWriteTime = Get-Date }
  • Unix touch 非常简单。
【解决方案4】:
type nul >>file & copy file +,,
  • 如果file 不存在,则创建它。
  • 保留文件内容。
  • 只使用 cmd 内置插件。
  • last-accesscreation 时间均已更新。

更新

啊!这不适用于只读文件,而 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"

【讨论】:

  • 可惜copy不能像xcopy那样忽略+r属性。或者,很遗憾 xcopy 不支持奇怪的filename +,, 语法。
  • 不幸的是,这不起作用(至少在 Windows 7 中不起作用)。如果文件实际上没有被修改(即没有要重定向的数据),命令解释器似乎不会更新重定向目标的时间戳。
【解决方案5】:

@dash-tom-bang:

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

复制 /b 源+,,

逗号表示省略 目标参数。

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

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

【讨论】:

  • 现在这只是语法混乱。说真的,他们在想什么? 另请注意,同样的文档说“目的地:必填。”...我很惊讶。
  • 这似乎在 Vista 中也不起作用......我想知道他们是否明白了?
  • 适用于 Windows 7
  • 即使没有逗号,它也对我有用:复制 file.ext+ 所以文档与实际行为相差甚远,因为行为与任何合理的预期相差甚远。
  • 它在 Windows Server 2008 中有效,但前提是您位于包含该文件的文件夹中
【解决方案6】:

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

【讨论】:

    【解决方案7】:

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

    ps c:myDir> Get-ChildItem . * -recurse | ForEach-Object{$_.LastWriteTime = get-date}
    

    【讨论】:

    • 不那么冗长,但只使用标准的 Powershell 简写:ls * -recurse | % { $_.LastWriteTime = Get-Date }
    【解决方案8】:

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

    ECHO text>file1.txt
    

    【讨论】:

    • 这是迄今为止最好的快速方法。我只需要创建一个 .gitignore 文件,而 Windows 7 一直在抱怨“必须输入文件名”等等。echo pie>.gitignore 工作了 - 谢谢!
    • @Alex 这无关紧要,但那个 windows 错误是因为文件以句点开头。在 Windows 资源管理器中解决这个问题有一个奇怪的技巧:使文件也以句点结尾。所以输入.gitignore.,当你按下回车键时,Windows 会删除尾随句点。很疯狂,但它确实有效。
    • 我希望我能给这个足够多的支持,它会吸引大玩家的人气。
    • 这不会创建一个空文件,file1.txt 中有“文本”。
    • touch 不仅用于创建空文件,而且创建空文件不是OP询问的用法。问题是“当您想更新文件的日期修改字段时,您会使用什么?”这个答案没有回答那个问题。相反,这个答案回答的问题是:“如何创建一个包含任意文本的文件,如果同名文件已经存在,则清除现有内容?”这是对原始问题的误导性和可能危险的答案。
    【解决方案9】:

    GnuWin32 项目具有 Unix 命令行实用程序的 Gnu 版本的 Windows 端口。

    它以多个单独的包的形式提供,您可以只安装您需要的命令,而无需其他依赖项。对于touch,您需要CoreUtils 包。

    【讨论】:

      【解决方案10】:

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

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

      【讨论】:

      • 在这里,您只需要安装目录中的 touch.exe 和 cygwin.dll 文件即可使用该工具。相对于使用基于 cygwin 的工具而言,没有其他依赖项。
      • 当我尝试这个 (win7x64) 除了 touch.exe 之外,我还需要 4 个 cygwin dll: cygiconv-2.dll cygintl-8.dll cygwin1.dll cyggcc_s-1.dll
      【解决方案11】:

      这是我写给add right-click "touch" in Windows explorer 的一个简单的regfile。编写脚本也很容易,因为它只是调用:

      cmd.exe /c copy %1+nul %1 /by
      

      【讨论】:

      • 别忘了copy nul some_file 创建一个空文件(这是我看到touch 最常用的)。
      • 确认!无法访问 Zip 文件(有关 brinkster22.com 的内容需要成为引用站点)。乔恩,你能更新一下吗?
      • 适用于 Win7。不适用于 WinXP:执行“复制”后文件时间保持不变。
      【解决方案12】:

      Native win32 ports of many unix commands,包括触摸。

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

      【讨论】:

        【解决方案13】:

        CodeProject 试试这个。

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

        【讨论】:

        • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
        【解决方案14】:

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

        【讨论】:

        • 不能在没有 cygwin 的 Windows 上运行。
        • 没有 mintty 的 cygwin 实在是太蹩脚了。
        【解决方案15】:

        此内容可以保存到 reg 文件中。这将为所有具有“触摸文件”功能的文件添加一个右键单击上下文菜单(在 Windows 7 上测试)。 将以下行复制 all 到 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\" +,,"
        

        【讨论】:

        • 我目前最喜欢的方法
        【解决方案16】:

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

        【讨论】:

          【解决方案17】:

          来自 Stack Overflow 上的 similar question

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

          copy /b filename.ext +,,
          

          【讨论】:

          • 这是 2 年前 Gish Domains 的回答的重复,没有解释。
          【解决方案18】:

          【讨论】:

          • 谢谢。我在搜索中错过了这一点,这导致了大量与触摸屏手机相关的东西。我猜可能需要一个更好的标签标签。
          【解决方案19】:

          来自网站:

          Funduc Software Touch 是一个免费的“触摸”实用程序,可让您 更改一个或多个文件的时间/日期和/或属性标记。在 此外,FS Touch 可以加/减指定的秒数 现有文件时间。您可以指定哪些文件和/或 通过“复杂文件掩码”更改子目录。该程序可以 从交互式或命令行运行。 7.2 版的新功能是 用于更改文件修改时间戳的命令行开关 +/- 指定的秒数。

          FS Touch 在 Windows XP、Vista、Windows 7 和 Windows 8 上运行。

          【讨论】:

            【解决方案20】:

            如果您将 git 用于一个或多个项目,则基于 mingw 的 Windows git-bash 具有 touch 命令。 我要感谢@greg-hewgill 向我指出'nix 实用程序适用于 Windows,因为正是它让我产生了尝试在 git-bash 中进行触摸的想法。

            【讨论】:

              【解决方案21】:

              在 PowerShell 中尝试:

              ni fileName.txt
              

              NINew-Item cmdlet 的别名。

              【讨论】:

              • 欢迎来到超级用户。感谢您发布!您能否添加一个指向提供有关ni 命令的更多信息的网站的链接,并可能描述更多该命令的作用?
              • New-Item cmdlet 不能用于更新现有文件的时间戳。
              • 虽然它不更新时间戳,但它确实创建了一个新文件,这正是 touch 所做的。来自我的 +1。
              • 我通常使用触摸来创建文件,但偶尔会更新时间戳(例如强制重制)
              【解决方案22】:

              将以下内容另存为 touch.bat 在您的 %windir%\system32 文件夹中或添加 将其保存到 PATH 环境变量的文件夹:

              @echo off
              if %1.==. goto end
              if not exist %1 goto end
              copy /b %1 +,, > nul
              echo %1 touched!
              :end
              

              示例用法:

              touch *.cpp
              touch somefile.c
              

              参考:Microsoft KB 69581

              【讨论】:

              • 太棒了!没有外部的东西,只是复制。当然,我们大多数人都需要它作为批处理剥离:)
              【解决方案23】:

              如果你安装了 vim,我找到了一个快速的方法(对于大文件来说不是很好,会打开整个文件然后关闭它......)

              vim foobar.txt +wq!
              

              “+”设置参数以运行以下命令。 “哇!”是“写,退出,强制”。这将打开文件,进行保存,然后立即关闭它。

              【讨论】:

              • 毫无意义的复杂、笨重且不便携。 -1
              【解决方案24】:

              我想要从另一个文件本地克隆/复制文件日期的“触摸”功能,并且可以从批处理文件中使用。

              因此,将视频文件“拖放”到批处理文件中,FFMPEG 运行,然后将输入文件中的“创建日期”和“修改日期”复制到输出文件中。

              起初这似乎很简单,直到您发现批处理文件在处理 unicode 文件名方面很糟糕,内联 PowerShell 会混淆文件名符号,并且双重转义它们是一场噩梦。

              我的解决方案是让“触摸”部分成为一个单独的 PowerShell 脚本,我称之为“CLONE-FILE-DATE.ps1”,它包含:

              param
              (
                [Parameter(Mandatory=$true)][string]$SourcePath,
                [Parameter(Mandatory=$true)][string]$TargetPath
              )
              
              (GI -LiteralPath $TargetPath).CreationTime  = (GI -LiteralPath $SourcePath).CreationTime
              (GI -LiteralPath $TargetPath).LastWriteTime = (GI -LiteralPath $SourcePath).LastWriteTime
              

              下面是我的“CONVERT.BAT”批处理文件中的示例用法:

              %~dp0\ffmpeg -i "%~1" ACTION "%~1-output.mp4"
              
              CHCP 65001 > nul && PowerShell -ExecutionPolicy ByPass -File "%~dp0\CLONE-FILE-DATE.PS1" "%~1" "%~1-output.mp4"
              

              我认为 PowerShell 是可读的,所以将解释批处理发言:

              %~dp0是批处理文件的当前目录。

              %~1 是不带引号的批处理文件的路径。

              CHCP 65001 > nul 将字符设置为 UTF-8 并吞下输出。

              -ExecutionPolicy ByPass 让您无需修改​​全局策略即可运行 PowerShell,该策略可防止人们意外运行脚本。

              【讨论】:

                【解决方案25】:

                试试

                fsutil 文件 createnew new.txt 0

                【讨论】:

                • The FSUTIL utility requires that you have administrative privileges. -- 对于现有文件,它的行为与 touch 不同。
                【解决方案26】:

                上面提到的五个替代方案,加上这里没有提到的三个,可以在 SuperUser 上找到:"Windows Recursive Touch Command"

                【讨论】:

                • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
                【解决方案27】:

                这与原始问题有点无关,但由于 GUI,我发现这在 Windows 上非常有用。

                我正在使用提供 GUI(内置于资源管理器外壳中)的 TouchPro 实用程序:

                http://www.jddesign.co.uk/products/touchpro/touchpro.htm

                【讨论】:

                  【解决方案28】:

                  我很欣赏这是一个老问题,我刚刚在我的 Windows 10 系统上发现了触摸。我从here(我想)下载并安装了Git,它看起来像touch和其他各种实用程序都在bin文件夹中。

                  【讨论】:

                    【解决方案29】:

                    好吧,如果你真的想要touch命令可用,你可以把它放在一个名为touch.bat的批处理文件中,然后把它放在C:\Windows中:

                    TYPE NUL >>%1
                    

                    足够简单。

                    【讨论】:

                    • 此方法不会更新以下平台上的修改时间:Windows Server 2012 R2、Windows Server 2016、Windows 10
                    【解决方案30】:

                    Unix 人员修复了使用 touch 命令更新任何文件的文件日期的一般问题。但是,对于 Windows,有时可以针对特殊情况使用更简单的方法。

                    我需要更新 Windows 8.1 中应用程序快捷方式的时间戳,以便更改应用程序磁贴的背景颜色可见,请参阅this SO question。我发现编辑快捷方式的注释字段更容易,而不是实现上面的聪明工具之一。大多数人将其留空,但当然,很快就会构思出有用的评论。如果存在评论,添加或删除最后一个句点也不会造成任何损害。

                    【讨论】:

                      猜你喜欢
                      • 2012-08-29
                      • 2020-08-18
                      • 1970-01-01
                      • 1970-01-01
                      • 2019-08-16
                      • 1970-01-01
                      • 2016-10-02
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多