Board logo

标题: [问题求助] [已解决]如何用Powershell修改指定文件夹的创建日期和时间 [打印本页]

作者: thp2008    时间: 2021-3-15 17:50     标题: [已解决]如何用Powershell修改指定文件夹的创建日期和时间

本帖最后由 thp2008 于 2021-3-18 22:04 编辑

我在网上,找到下面的命令:
批量修改指定目录及子目录下的所有文件及子文件夹的日期和时间
powershell.exe -command "Get-Childitem -path 'E:\test' -Recurse | foreach-object { $_.LastWriteTime = Get-Date; $_.CreationTime = Get-Date }"

这条是指定文件的,最后创建时间、修改时间、访问时间
powershell.exe -command "ls 'e:\test\abc.txt' | foreach-object { $_.CreationTime = '02/02/2020 01:01:01';$_.LastAccessTime = '11/04/2019 20:42:23';$_.LastAccessTime = '11/04/2019 20:42:23' }"

REM $_.LastWriteTime = '03/03/2020 01:01:01';   修改时间
REM $_.CreationTime = '02/02/2020 01:01:01' }"  创建时间
REM $_.LastAccessTime = '11/04/2019 20:42:23';  访问时间

我测试了一上,是可以将E:\test目录下,所有文件及子目录的修改日期和时间,创建日期和时间都修改成当前日期有时间,或者将Get-Date换成指定的日期和时间也行。是可以用的。没用问题。
但是我发现,命令不能对根目录test本身有效,我就想问一下,如何对根目录,或者指定的目录修改创建日期和时间。
目录好像只有创建日期和时间,没有其它的日期和时间。
感谢!
作者: WHY    时间: 2021-3-15 19:07

  1. PowerShell "$a=Get-Childitem -path 'E:\test' -Recurse; $b=get-Item 'E:\test'; $a+$b | foreach-object { $_.LastWriteTime = Get-Date; $_.CreationTime = Get-Date }"
复制代码

作者: thp2008    时间: 2021-3-16 11:17

回复 2# WHY

感谢您的帮助,
但是我运行了一下,报错了。

PS F:\> PowerShell "$a=Get-Childitem -path 'f:\sss' -Recurse; $b=get-Item 'f:\sss'; $a+$b | foreach-object { $_.LastWriteTime = Get-Date; $_.CreationTime = Get-Date }"
所在位置 行:1 字符: 62
+ =Get-Childitem -path 'f:\sss' -Recurse; =get-Item 'f:\sss'; + | forea ...
+                                                              ~
一元运算符“+”后面缺少表达式。
    + CategoryInfo          : ParserError: ( [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingExpressionAfterOperator

PS F:\>
作者: WHY    时间: 2021-3-16 16:25

回复 3# thp2008


    复制粘贴到 CMD 命令提示符中运行。
作者: thp2008    时间: 2021-3-16 23:44

回复 4# WHY

也不行,

F:\>owerShell "$a=Get-Childitem -path 'F:\sss' -Recurse; $b=get-Item 'F:\sss'; $a+$b | foreach-object { $_.LastWriteTime = Get-Date; $_.CreationTime = Get-Date }"
设置“LastWriteTime”时发生异常:“文件“F:\sss”正由另一进程使用,因此该进程无法访问此文件。”
所在位置 行:1 字符: 90
+ ... F:\sss'; $a+$b | foreach-object { $_.LastWriteTime = Get-Date; $_.Cre ...
+                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: ( [], SetValueInvocationException
    + FullyQualifiedErrorId : ExceptionWhenSetting

设置“CreationTime”时发生异常:“文件“F:\sss”正由另一进程使用,因此该进程无法访问此文件。”
所在位置 行:1 字符: 119
+ ... ch-object { $_.LastWriteTime = Get-Date; $_.CreationTime = Get-Date }
+                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], SetValueInvocationException
    + FullyQualifiedErrorId : ExceptionWhenSetting
作者: WHY    时间: 2021-3-17 16:04

win7 sp1 中文旗舰版,PS 版本 2.0,测试没有问题。
Windows PowerShell
版权所有 (C) 2009 Microsoft Corporation。保留所有权利。

PS C:\Users\WHY> $a = get-Item 'E:\Test'
PS C:\Users\WHY> $a.LastWriteTime = get-Date
PS C:\Users\WHY> $a.CreationTime = get-Date
PS C:\Users\WHY> dir 'E:\Test' -Recurse | forEach{ $_.LastWriteTime = get-Date; $_.CreationTime = get-Date }

作者: thp2008    时间: 2021-3-17 22:21

回复 6# WHY


    不怪得,我测试了多次,都不行,我是Windowns10 64位  Microsoft Windows [版本 10.0.19042.868]
作者: WHY    时间: 2021-3-18 00:09

回复 7# thp2008


    跟系统应该没有太大关系,可能是你用资源管理器打开了 E:\Test 目录,进程被占用而无法修改。把文件夹窗口关掉再试。
或者,这样试试:
  1. (New-Object -com Shell.Application).Windows() | ?{ $_.FullName -match '\\explorer\.exe$' } | forEach{ $_.Quit() }
  2. get-Item 'E:\Test' | forEach{ $_.LastWriteTime = get-Date; $_.CreationTime = get-Date }
  3. dir 'E:\Test' -Recurse | forEach{ $_.LastWriteTime = get-Date; $_.CreationTime = get-Date }
复制代码

作者: thp2008    时间: 2021-3-18 11:01

回复 8# WHY

我按照您说的,测试了一下,发现,的确是因为我打开了资源管理器的原因,只要开着资源管理器就不行,不管有没有打开那个目录。
第一条是强制结束资源管理器,没有问题。
第二条:
  1. get-Item 'F:\sss' | forEach{ $_.CreationTime = '02/02/2020 12:23:01';$_.LastWriteTime = '11/02/2020 12:23:01'; }
复制代码
这条代码是没问题,可以修改成功,感谢!
但是为什么现在这条代码就不能在CMD中执行了,一定要在Powershell中执行。这样的话,就跟我之前的批处理,不能一起工作,要单独执行。
能不能麻烦您,帮我改成可以在CMD中执行的命令行。我在前面加上powershell -command 也不行,会报'forEach' 不是内部或外部命令,也不是可运行的程序或批处理文件。
  1. dir 'F:\sss' -Recurse | forEach{ $_.LastWriteTime = get-Date; $_.CreationTime = get-Date }
复制代码
这条可以执行成功,但是没有输出任何结果,应该是查看指定目录的日期时间信息。但没有任何显示。

再次表示感谢!
作者: WHY    时间: 2021-3-18 17:27

第1命令:关闭所有由 explorer 打开的窗口;
第2条命令:修改 E:\Test 目录本身的创建日期、最后修改日期;
第3条命令:修改 E:\Test 下面的文件(目录)及其子目录下面的文件(目录)的创建日期、最后修改日期。

如果需要把这三条改写成批处理 bat 的形式:
  1. @echo off
  2. PowerShell "(New-Object -com Shell.Application).Windows() | ?{ $_.FullName -match '\\explorer\.exe$' } | forEach{ $_.Quit() }; get-Item 'E:\Test' | forEach{ $_.LastWriteTime = get-Date; $_.CreationTime = get-Date }; dir 'E:\Test' -Recurse | forEach{ $_.LastWriteTime = get-Date; $_.CreationTime = get-Date }"
  3. pause
复制代码

作者: thp2008    时间: 2021-3-18 22:04

回复 10# WHY


    感谢您的帮助!解决了。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2