Powershell:将“上次修改时间”与“特定日期”进行比较,并用正确的日期替换

Powershell: Compare Last Modified to Specific Date and replace with correct Date

我对Powershell还是很陌生,所以请多多包涵。

我有2个几乎相同的目录。旧目录中的文件和文件夹已复制到新目录中。但是,在此转移过程中,上次修改日期发生了变化。新目录中的文件和文件夹的上次修改日期不正确(例如:今天)。

与其重新执行转移过程(这将花费很长时间),我想在Powershell中编写一些内容,以比较两个目录的最后修改日期并更正新目录中的日期。

我还要首先检查自文件传输以来是否已修改文件/文件夹。没有理由更改这些文件上的日期。

通过环顾四周和谷歌搜索发现:
链接1链接2链接3链接4

我知道我可以使用以下命令获取文件的最后修改日期:

1
(Get-Item $filename).LastWriteTime

其中$ filename是文件目录。

我还遇到了以下问题:

1
dir $directory | ? {$_.lastwritetime -gt"6/1/19" -AND $_.lastwritetime -lt"12/30/19"}

我知道我可以获得有关2个日期之间修改的文件的信息。为此,我可以进行调整,以便可以使用"小于(-lt)"来检查在特定日期后未修改的文件。

1
dir $directory | ? {$_.lastwritetime -lt `12/13/19'}

这实现了我的目标之一。我有一种方法可以检查文件是否已被修改超过某个值。

我看到这是为了更改lastwritetime的值

1
2
$folder = Get-Item C:\\folder1
$folder.LastWriteTime = (Get-Date)

并意识到这仅仅是

1
(Get-Item $filename).LastWriteTime = (Get-Date)

我可以对其进行修改以满足我替换旧文件正确时间的新文件的上次写入时间的目标:

1
(Get-Item $filename).LastWriteTime = (Get-Item $filename2).LastWriteTime

我想我正在挣扎的是将它们放在一起。我知道如何通过添加" recurse"参数来遍历文件/文件夹中的复制项甚至Get-Childitem。但是我很难绕过头来递归地浏览每个目录以更改日期。

感谢您的帮助。


您可以执行以下操作以将原始文件和文件夹的LastWriteTime属性与副本进行比较,同时要记住,副本文件夹中的文件自上次传输日期以来可能已被更新。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# set the date to the last transfer date to determine if the file was updated after that
$lastTransferDate = (Get-Date).AddDays(-10)  # just for demo 10 days ago

# set the paths for the rootfolder of the originals and the rootfolder to where everything was copied to
$originalPath = 'D:\\OriginalStuff'
$copyPath     = 'E:\\TransferredStuff'

# loop through the files and folders of the originals
Get-ChildItem -Path $originalPath -Recurse | ForEach-Object {
    # create the full path where the copied file of folder is to be found
    $copy = Join-Path -Path $copyPath -ChildPath $_.FullName.Substring($originalPath.Length)
    # test if this object can be found
    if (Test-Path -Path $copy) {
        $item = Get-Item -Path $copy
        # test if the item has not been updated since the last transfer date
        if ($item.LastWriteTime -le $lastTransferDate) {
            # set the timestamp the same as the original
            $item.LastWriteTime = $_.LastWriteTime
        }
    }
}

到目前为止的工作做得很好。

只需将您拥有的内容放入foreach语句中即可。

1
2
3
4
5
6
Foreach($item in (gci 'C:\\Users\\usernamehere\\Desktop\\folder123' -recurse)){

    (Get-Item $item.FullName).LastWriteTime = (Get-Item"C:\\Users\\usernamehere\\Desktop\\folderabc\
andomFile.txt"
).LastWriteTime

}

我们将带有-recurse标志的Get-Childitem命令包装到括号中,以便该命令自己执行并成为foreach命令遍历的集合。 $ item是循环中的当前项目。 我们将要使用.FullName属性来了解当前项目文件的完整路径。 这样说,您将一起使用$item.FullName来设置日期。