Windows是否等效于Linux命令“触摸”?


175

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

  1. 命令通过C ++,.NET,C#,或Windows东西天然访问(Vista中优选)
  2. 工具/应用程序最好是免费的,并且如果可能的话,还应开源

编辑:已经有CheapScotsman 在此处指出的应用程序页面。

如果有人知道我如何通过C ++,C#,WSH或类似的方式做到这一点,那么我认为链接的问题涵盖了其他所有内容。


可以在类似问题的答案中找到上面提到的四个替代方案,以及此处未提及的四个替代方案:“ Windows递归触摸命令”
JdeBP 2011年

stackoverflow.com/questions/210201/… 提到了负载,包括REM.>a
barlop 2015年

Answers:


356

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

copy /b filename.ext +,,

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

*更改文件的时间和日期

如果要为文件分配当前时间和日期而不修改文件,请使用以下语法:

copy /b Source+,,

逗号指示Destination参数的省略。

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

@COPY /B %1+,, %1

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


46
这是在做什么 它在哪里记录?(Google无法为“ +,”建立索引,并且MS网站无法正确地引导我,因为在“副本”上进行搜索几乎没有任何用处。)我的意思是,它很好用,我会接受的这是理所当然的,但我很好奇。
dash-tom-bang


14
type touch.batis @echo off和下一行copy /b %1 +,,-将其放入C:\bin您自己的脚本中,或者将其放入您自己的脚本中,然后可以使用touch myfile.txt
Lumi

17
在Win7中,如果您不在包含该文件的文件夹中,则此方法将无效。它将在当前工作目录中创建一个副本。

6
如果您需要在远程文件夹(UNC路径)中执行此操作-您还必须指定复制命令的目标位置copy /b Source+,, Source--其中Source包括文件的完整路径
Justin

162

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


5
就像几乎所有的unix-to-windows端口一样,它不能与非编码程序默认设置的编码集之外的文件名中的Unicode字符一起使用。测试文件名,它将使所有此类工具"test тест τεστ.txt"
失效

gnuwin32拥有它。但确实,gnuwin32的unicode字符也会失败。
barlop

1
2017年的更新在Windows 10中,我们可以将Linux子系统用于Windows,该子系统将安装bash。不需要cygwin,MinGW,unxutils或Windows端口的任何其他部分Unix。docs.microsoft.com/en-us/windows/wsl/install-win10
达沃斯

@Davos是否已在用户上下文(通常是非特权用户)以外的任何文件上进行了尝试?因为从技术上讲,LXSS的用户区侧以非特权用户身份运行。
0xC0000022L

@ 0xC0000022L不确定您在touch命令上下文中的含义。就像在nix环境中的其他任何事情一样,您可以执行此操作,也可以对其进行sudo,或者因为您没有特权而不能执行。
达沃斯

96

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

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

9
PowerShell FTW。我的意思是说真的,unix很酷,但是PS很酷。
马特

1
您也可以更新上一次写入多个文件/文件夹的时间

12
这仅适用于一个文件。对于多个文件:ls * | ForEach对象{$ _。LastWriteTime = Get-Date}
Eli Algranti 2012年

2
如果要递归执行,则效果很好:gci -recu -inc“ ” | %{$ _。LastWriteTime = Get-Date}
BrainSlugs83

6
@ BrainSlugs83:使用反引号`作为代码:gci -recu -inc "*.*" | % { $_.LastWriteTime = Get-Date }
alldayremix 2013年

58
type nul >>file & copy file +,,
  • 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"

可惜的是,复制不能像xcopy一样忽略+ r属性。或者,很遗憾xcopy不支持奇怪的filename +,,语法。
亚伯2012年

不幸的是,这不起作用(至少在Windows 7中不起作用)。如果文件没有被实际修改(即没有要重定向的数据),则命令解释器似乎不会更新重定向目标的时间戳。
Synetech

32

@ dash-tom-bang:

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

复制/ b Source +,

逗号指示Destination参数的省略。

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

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


16
现在,这只是弄乱了语法。说真的,他们在想什么?另请注意,同一文档说“目的地:必需。” ...我很惊讶。
某事

1
这似乎在Vista中甚至都行不通...我想知道他们是否意识到了吗?
quillbreaker

1
在Windows 7中工作
Imran 2010年

5
即使没有逗号,它也对我有用:copy file.ext +因此,文档与实际行为相距甚远,而且行为与任何合理的期望均不相上下。
Abgan

2
它在Windows Server 2008中有效,但
前提


21

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

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

2
不太冗长,但仅使用标准的Powershell速记:ls * -recurse | % { $_.LastWriteTime = Get-Date }
Jonas

15

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

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


15

cygwin附带touch。我知道您提到过您不想安装整个框架,但是cygwin非常轻巧,可以在不打开整个类Unix命令行的情况下从dos命令窗口调用它。

您还可以控制要安装的工具,因此只需安装touch.exe文件,然后剩下框架的其余部分。


2
在这里,您只需安装目录中的touch.exe和cygwin.dll文件即可使用该工具。与使用基于cygwin的工具相关的其他依赖项没有。
高个杰夫

1
当我尝试这个(win7x64)时,除了touch.exe外,我还需要4个cygwin dll:cygiconv-2.dll cygintl-8.dll cygwin1.dll cyggcc_s-1.dll
马特·威尔基

15

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

ECHO text>file1.txt

3
这是迄今为止最好的快捷的方法。我只需要创建一个.gitignore文件以,和Windows 7一直抱怨“必须输入一个文件名”等等等等 echo pie>.gitignore工作一种享受-谢谢!

4
@Alex这是无关的,但是Windows错误是因为文件以句点开头。Windows资源管理器中有一个奇怪的解决方法:使文件也以句点结尾。因此,键入.gitignore.,然后按Enter键,Windows将删除尾随时间段。疯狂,但是有效。
布拉德·库皮

1
我希望我能给予足够的支持,以吸引流行的大公司。
乔纳森·梅

1
但是,这不会创建一个空文件,file1.txt中包含“文本”。
约书亚·

14

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

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

并且不要忘记copy nul some_file创建一个空文件(这是我touch最常使用的文件)。
乔伊(Joey)

阿克!无法访问Zip文件(有关brinkster22.com的内容需要作为参考网站)。乔恩,你能更新一下吗?
Dan7119 2011年

适用于Win7。在WinXP上不起作用:执行“复制”后文件时间保持不变。
Egor Skriptunoff


11

CodeProject尝试这个。

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

2
尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。
Yan Sklyarenko 2014年





4

从网站:

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

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


4

该内容可以保存到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\" +,,"

3

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


3

在PowerShell中尝试:

ni fileName.txt

NINew-Item cmdlet 的别名。


1
欢迎来到超级用户。感谢您的发布!您是否可以添加指向网站的链接,以提供有关该ni命令的更多信息,也许还可以描述该命令的更多功能?
hBy2Py 2015年

1
New-Itemcmdlet不能用于更新现有文件的时间戳。
Twisty模仿者

尽管它不更新时间戳,但它确实创建了一个新文件,这就是touch所做的。向我+1。
MikeMurko

2

将以下内容保存为%windir%\ system32文件夹中的touch.bat或将其保存到的文件夹添加到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


优秀的!没有外部的东西,只是复制。当然,我们大多数人都需要将其作为批处理剥离:)
Bogdan Gavril MSFT

2

如果您安装了vim,我发现了一种快速的方法(不适用于大文件,将打开整个文件然后将其关闭...)

vim foobar.txt +wq!

“ +”设置参数以运行以下命令。“哇!” 是“写作,辞职,强迫”。这将打开文件,进行保存,然后立即将其关闭。


没有意义的复杂,笨重且不可携带。-1
MD XF

2

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

因此,将视频文件“拖放”到批处理文件中,然后运行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,而无需修改全局策略,该策略可以防止人们意外运行脚本。


1

尝试

fsutil文件createnew new.txt 0


2
The FSUTIL utility requires that you have administrative privileges.-它的行为不像touch现有文件那样。
基思·汤普森

1

可以在SuperUser上找到上面提到的五个替代方法,以及此处未提及的三个替代方法:“ Windows递归触摸命令”


2
尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。
Yan Sklyarenko 2014年


1

好吧,如果您真的想使用该touch命令,可以将其放在一个名为的批处理文件中,touch.bat并将其粘贴在C:\Windows

TYPE NUL >>%1

很简单。


此方法不会在以下平台上更新修改时间:Windows Server 2012 R2,Windows Server 2016,Windows 10
Nate

0

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

我需要在Windows 8.1中更新应用程序快捷方式的时间戳,以使对“应用程序图块”的背景色的更改可见,请参阅此SO问题。我发现实现快捷方式的注释字段更容易,而不是实现上面的一种巧妙工具。大多数人对此保持空白,但是当然很快就会想到一个有用的评论。并且,如果存在评论,则添加或删除最后期限绝对不会造成损害。


0

我很欣赏这是一个老问题,我刚刚发现Windows 10系统上有触摸。我从这里下载并安装了Git (我认为),bin文件夹中似乎有touch和其他各种实用程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.