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



可通过C ++ 、. NET,C#或某些本机访问的命令Windows(最好是Windows Vista)

工具/应用程序最好是免费的,并且如果可能的话,还应该是开源的

编辑:
已经有一个页面指出了应用程序由CheapScotsman在这里。

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

评论

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

stackoverflow.com/questions/210201/…提到了一个负载,包括REM。> a

npmjs.com/package/touch-for-windows对我有用

#1 楼

如果要使用Windows触摸文件的日期戳,请在命令提示符下使用以下命令:
copy /b filename.ext +,,

(其中filename.ext是文件名)。 +,,copy的特殊标志,告诉它仅更新文件上的日期/时间:

*更改文件的时间和日期
如果要分配当前时间并在不修改文件的情况下为文件添加日期,请使用以下语法:
copy /b Source+,,
逗号表示省略了Destination参数。

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

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

评论


键入touch.bat是@echo off,然后下一行复制/ b%1 +,-将其放入C:\ bin或您自己的脚本中,然后像touch myfile.txt一样使用它。

–卢米
2011年6月13日下午13:37

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

–杰米
2012年6月27日7:48

@mob注意,在大文件上,这并不慢。我在网络驱动器上的大于1GB的文件上使用了它,并立即返回(并正常工作)。

–查德威克
2013年1月23日19:51

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

–贾斯汀
2013年12月13日22:37

+ ,:blogs.msdn.com/b/oldnewthing/archive/2013/07/10/10432879.aspx

–thirtydot
2014年5月8日在1:33

#2 楼

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

评论


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

–RomanSt
2014年4月29日,下午3:06

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

– barlop
16年1月23日在4:37

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

–达沃斯
18 Mar 26 '18 at 10:39

@Davos您是否尝试过(通常是非特权的)用户上下文以外的任何文件?因为从技术上讲,LXSS的用户层侧以非特权用户身份运行。

– 0xC0000022L
19年8月21日在10:22

如今,安装代码签名的Windows版Git软件包并从那里使用touch确实更加容易,因为在任何情况下,您都可以在任何(NT)用户上下文中使用它,而您的建议完全将您限制为拥有的文件和文件夹用户启动WSP应用程序(或至少那些只有通过设置适当的ACE才能访问以修改时间戳记的用户)。上面的端口也应出于相同的原因工作。您使用WSL的方法将仅在WSL沙箱的约束内起作用。

– 0xC0000022L
19年8月21日在12:23

#3 楼

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

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


评论


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

–马特
2011年9月9日14:35

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

– ThiagoAlves
2011-09-22 1:50

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

– Eli Algranti
2012年10月2日,下午4:52

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

– BrainSlugs83
13年1月15日在1:43

@ BrainSlugs83:对代码使用反引号`:gci -recu -inc“ *。*” | %{$ _。LastWriteTime = Get-Date}

–alldayremix
13年6月29日在0:44

#4 楼

type nul >>file & copy file +,,



创建file(如果不存在)。
仅保留文件内容。
仅使用内置的cmd
last-access和创建时间已更新。

UPDATE

Gah!这不适用于只读文件,而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年5月6日20:05

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

– Synetech
2015年9月15日下午0:57

#5 楼

@ dash-tom-bang:

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


复制/ b Source + ,

逗号指示
Destination参数的省略。


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

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

评论


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

– sth
09年11月25日13:22

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

–抢劫犯
09年12月8日在20:53

在Windows 7中工作

–伊朗
2010-12-09在5:37

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

– Abgan
2011年7月17日在11:24

它在Windows Server 2008中有效,但前提是您位于包含该文件的文件夹中

– FrinkTheBrave
2011-12-12 14:48

#6 楼

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

#7 楼

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

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


评论


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

–乔纳斯(Jonas)
17-4-5在9:51



#8 楼

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

ECHO text>file1.txt


评论


这是FAR最好的快速方法。.我只需要创建一个.gitignore文件,Windows 7一直抱怨“必须输入文件名”等。echo pie> .gitignore很好用-谢谢!

– Alex McMillan
2014年3月7日在4:02

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

–布拉德·库皮(Brad Cupit)
15年4月23日在15:26

我希望我能给予足够的支持,以吸引流行的大公司。

–乔纳森·梅(Jonathan Mee)
16-3-3在16:56

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

–约书亚·迈耶斯(Joshua Meyers)
17年3月15日在22:06

#9 楼

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

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

#10 楼

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

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

评论


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

–高杰夫
08年9月9日在10:58

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

–马特·威尔基
2010年5月27日20:33

#11 楼

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

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


评论


并且不要忘记复制nul some_file来创建一个空文件(这是我看到的最常用的触摸文件)。

–乔伊
09年8月27日在6:28

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

– Dan7119
2011-3-28 14:22

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

– Egor Skriptunoff
16年8月25日在19:26



#12 楼

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

我以前使用过它,并且效果很好-无需安装,没有DLL等

#13 楼

从CodeProject尝试这一。


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


评论


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

– Yan Sklyarenko
2014年6月5日14:32

#14 楼

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

评论


没有Cygwin,就无法在Windows上生活。

– jweede
09-09-10 12:32

没有薄荷味的cygwin非常la脚。

–啊
2010-1-25 14:30

#15 楼

有许多Unix实用程序的Windows端口。
看看unxutils或GnuWin32项目。

#16 楼

来自关于堆栈溢出的类似问题。

要更新时间戳(忽略touch的其他功能),我可以选择:

copy /b filename.ext +,,


评论


这是2年前之前重复的“鱼域”答案的解释,没有解释。

–fixer1234
16-2-20在0:39

#17 楼

此内容可以保存到reg文件中。这将为所有具有“ Touch File”功能的文件(在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\" +,,"


#18 楼

如何编写代码项目“ Touch for Windows”:http://www.codeproject.com/KB/applications/touch_win.aspx

edit;与此处相同的问题:https://stackoverflow.com/questions/51435/windows-version-of-the-unix-touch-command/51439

评论


谢谢。我在搜索中错过了那一堆,导致大量与触摸屏手机相关的东西。我猜可能需要更好的标签标签。

– facepalmd
09年7月21日在21:52

#19 楼

来自网站:


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

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


#20 楼

如果您将git用于一个或多个项目,则基于mingw的Windows git-bash带有touch命令。
我要感谢@ greg-hewgill向我指出'nix实用程序存在于Windows中,因为让我想到尝试在git-bash中触摸的内容。

#21 楼

在PowerShell中尝试:

ni fileName.txt


NI是New-Item cmdlet的别名。

评论


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

– hBy2Py
2015年6月17日在2:17

New-Item cmdlet不能用于更新现有文件的时间戳。

–我说恢复莫妮卡
2015年6月17日在2:56

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

–MikeMurko
17年2月2日在16:59

#22 楼

将以下内容保存为%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
13年3月27日在22:07



#23 楼

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

vim foobar.txt +wq!


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

评论


无意义的复杂,笨重且不可携带。 -1

– MD XF
17年5月10日在17:45

#24 楼

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

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

起初这似乎很简单,直到您发现批处理文件在处理Unicode文件名方面很糟糕, -line PowerShell将文件名符号弄乱了,对它们进行两次转义是一场噩梦。

我的解决方案是将“ touch”部分变成一个单独的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

评论


FSUTIL实用程序要求您具有管理特权。 -并且它的行为不像触摸现有文件。

–基思·汤普森(Keith Thompson)
2012-2-18的1:39

#26 楼

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

评论


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

– Yan Sklyarenko
2014年6月5日14:32

#27 楼

这与最初的问题有点无关,但是由于GUI的缘故,我发现它在Windows上非常有用。

我正在使用提供GUI的TouchPro实用程序(内置于浏览器外壳中):

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

#28 楼

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

TYPE NUL >>%1


很简单。

评论


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

–内特
19/09/27 '16:13

#29 楼

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

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

#30 楼

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