当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] PowerShell 比较两个文件的 LastWriteTime [4 种方法]

作者:精品下载站 日期:2024-12-14 20:33:49 浏览:14 分类:玩电脑

PowerShell 比较两个文件的 LastWriteTime [4 种方法]


[玩转系统] PowerShell 比较两个文件的 LastWriteTime [4 种方法]

使用 LastWriteTime 属性

要在 PowerShell 中比较两个文件的 LastWriteTime

  • 使用 Get-Item 获取项目。
  • 使用 if-else 块比较两个文件的 LastWriteTime

使用 -eq 运算符:

$fileName1 = Get-Item "E:\Test\file1.txt"
$fileName2 = Get-Item "E:\Test\file2.txt"
if ($fileName1.LastWriteTime -eq $fileName2.LastWriteTime) {
    Write-Host "The LastWriteTime of the '$($fileName1.Name)' and '$($fileName2.Name)' is same."
}
elseif ($fileName1.LastWriteTime -gt $fileName2.LastWriteTime) {
    Write-Host "The LastWriteTime of the '$($fileName1.Name)' is greater than '$($fileName2.Name)'"
}
else{
    Write-Host "The LastWriteTime of the '$($fileName1.Name)' is greater lesser '$($fileName2.Name)'"
}

输出 :

The LastWriteTime of the 'file1.txt' is greater than 'file2.txt'

使用 Compare-Object Cmdlet

要在 PowerShell 中比较两个文件的 LastWriteTime

  • 使用 Get-Item 获取项目。
  • 使用 Compare-Object cmdlet 比较 PowerShell 中两个文件的 LastWriteTime
  • 使用 if-else 块确定两个文件的 LastWriteTime 是否相同。

使用比较对象 Cmdlet:

$fileName1 = Get-Item "E:\Test\file1.txt"
$fileName2 = Get-Item "E:\Test\file2.txt"
$fileComparison = Compare-Object -ReferenceObject $fileName1.LastWriteTime -DifferenceObject $fileName2.LastWriteTime
if ($fileComparison -eq $null) {
    Write-Host "The LastWriteTime of the '$($fileName1.Name)' and '$($fileName2.Name)' is same."
} else {
    Write-Host "The LastWriteTime of the '$($fileName1.Name)' and '$($fileName2.Name)' is different."
}

输出 :

The LastWriteTime of the 'file1.txt' and 'file2.txt' is different.

首先,我们使用 Get-Item cmdlet 获取给定位置的项目并将其存储在 $fileName1$fileName2 变量中。此 cmdlet 仅用于从指定位置获取项目,而不是其内容,除非我们使用通配符 (*) 来请求项目的整个内容。请注意,PowerShell 提供程序使用此 cmdlet 来遍历各种数据存储。

然后,我们使用 Compare-Object cmdlet 比较 $fileName1$fileName2LastWriteTime,并将其保存在 $fileComparison 中变量。此 cmdlet 用于比较 PowerShell 中的两组对象。这里,第一组对象是ReferenceObject,而第二组对象是DifferenceObject。在我们的例子中,$fileName1.LastWriteTime参考$fileName2.LastWriteTime差异

Compare-Object 查看可用于比较整个对象的可用方法;如果找不到任何合适的方法,则使用 ToString() 来比较字符串结果。使用此 cmdlet 时,我们可以提供一个或多个可用于执行比较的属性。

指定属性后,Compare-Object cmdlet 仅比较这些属性的值。

比较的结果表示指定属性是否仅出现在 DifferenceObject (=>) 中或 ReferenceObject ($lastWriteTimeDifference 对象等于 0。如果是,则执行 if 块;否则,elseif 块将检查 $lastWriteTimeDifference 对象的 TotalSeconds 属性的值是否大于 0 ;否则会执行else。

假设我们在特定位置有 n 个文件,我们想要将一个文件的 LastWriteTime 与其余文件进行比较。然后,我们可以使用以下方法来满足项目需求。

使用 Get-ItemProperty Cmdlet

要在 PowerShell 中比较两个文件的 LastWriteTime

  • 使用 Get-ChildItem cmdlet 从给定位置获取项目/子项目。
  • 使用Where-Object cmdlet 筛选从Get-ChildItem cmdlet 接收的对象。
  • 将第一个文件对象及其 LastWriteTime 保存在两个单独的变量中。
  • 使用 foreach 循环迭代所有过滤的对象。
  • 在每次迭代中:

    • 使用 Get-ItemProperty cmdlet 获取指定项目的 lastwritetime 属性。
  • 使用带有 -gt-lt 比较运算符的 if-else 块来比较 LastWriteTime
  • 使用 Write-Output cmdlet 可以打印第一个文件的上次写入时间是否与当前文件相同、早于或晚于当前文件。

使用 Get-ItemProperty Cmdlet:

$source = "E:\Test"
$allFiles =Get-ChildItem $source | Where-Object { !$_.PSIsContainer }
$firstFile = $allFiles[0]
$firstFileLastWriteTime = [datetime](Get-ItemProperty -Path $firstFile.FullName -Name LastWriteTime).LastWriteTime
foreach ($file in $allFiles) {
    $dateTime = [datetime](Get-ItemProperty -Path $file.FullName -Name LastWriteTime).lastwritetime
    if ($dateTime -gt $firstFileLastWriteTime) {
        Write-Output "$($file.Name) - Last Write Time is newer than $($firstFile.Name)"
    } elseif ($dateTime -lt $firstFileLastWriteTime) {
        Write-Output "$($file.Name) - Last Write Time is older than $($firstFile.Name)"
    } else {
        Write-Output "$($file.Name) - Last Write Time is the same as $($firstFile.Name)"
    }
}

输出 :

computersList.txt - Last Write Time is the same as computersList.txt
file - Copy.doc - Last Write Time is older than computersList.txt
file - Copy.pdf - Last Write Time is newer than computersList.txt
file.docx - Last Write Time is older than computersList.txt
file.pdf - Last Write Time is newer than computersList.txt
file2.txt - Last Write Time is older than computersList.txt
file3.txt - Last Write Time is older than computersList.txt
file4.txt - Last Write Time is older than computersList.txt
testPS.ps1 - Last Write Time is newer than computersList.txt

首先,我们使用源位置的路径定义并初始化一个名为 $source 的变量,在本例中为 E:\Test。接下来,我们使用 Get-ChildItem cmdlet 检索指定位置(上例中为 $source)中的项目。请记住,Get-ChildItem 可以从给定目录和子目录获取项目和子项目,并将它们作为 System.IO.FileInfoSystem.IO 返回。 DirectoryInfo 对象。

由于我们只对文件感兴趣,不想深入目录或子目录,因此我们使用 Where-Object cmdlet 来过滤和选择那些不是容器(目录)的对象。如何?让我们来理解一下。在 { !$_.PSIsContainer } 表达式中,{} 表示脚本块,$_ 表示管道中的当前对象,并且 ! 用于否定 PSIsContainer 属性的值。这意味着 Where-Object 将过滤所有容器并仅选择那些不是容器的对象。然后,我们将结果值存储在 $allFiles 变量中。

之后,我们使用 $allFiles[0] 检索第一个文件并将其存储在 $firstFile 变量中。我们还将 $firstFileLastWriteTime 存储在 $firstFileLastWriteTime 变量中。

接下来,我们使用 foreach 循环来迭代 $allFiles。在每次迭代中,我们都使用 Get-ItemProperty cmdlet 来获取当前项目的属性;在上面的代码中,我们获取了 lastwritetime 属性,使用 [datetime] 将其类型转换为 DATETIME 并将其存储在 $中日期时间变量。之后,我们使用 if-else 块以及 -gt-lt 运算符来比较 LastWriteTime $firstFile 与当前项目的上次写入时间并检查它是否比第一个文件的上次写入时间更旧、相同或更新。

在每个条件块中,我们使用 Write-Output cmdlet 来打印当前项目的名称(文件名),并描述上次写入时间是否与 computersList.txt 相同、更旧或更新。 这是我们的第一个文件。如果您想要所有文件的ModeLastWriteTimeLengthName,我们可以使用以下解决方案在指定位置。

使用 ls 命令

使用ls命令列出指定位置中LastWriteTime大于一天的多个文件的LastWriteTime

使用 ls 命令:

ls | where-object {(new-timespan $_.LastWriteTime).days -ge 1}

输出 :

Directory: E:\Test
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----          2/8/2023   9:26 PM            196 file1.txt
-a----          2/8/2023   9:31 PM             83 file2.txt
-a----         2/18/2023  12:18 PM             82 file3.txt

我们已经学习了本示例中使用的所有命令。您可能会将 ls 视为新命令,但这是上一节中已解释的 Get-ChildItem cmdlet 的别名。 ls 检索当前目录中使用管道 (|) 转发到 Where-Object cmdlet 的所有文件和子目录,其中 Where-Object 根据 LastWriteTime 属性过滤它们。

我们已经了解到 New-TimeSpan cmdlet 创建一个 TimeSpan 对象;此处,其 Days 属性表示时间跨度内的整天数。 Where-Object cmdlet 前面的表达式确定 TimeSpan 对象的 Days 属性是否大于或等于 1,这意味着当前项目最后一次写入是在一天多之前。如果此表达式为 True,则当前项目将添加到输出中。

如果您只对获取DayDateTime感兴趣,我们可以使用ls,如下所示。

使用 ls 命令:

$source = "E:\Test"
(ls $source).LastWriteTime

输出 :

Wednesday, February 8, 2023 9:26:59 PM
Wednesday, February 8, 2023 9:31:21 PM
Saturday, February 18, 2023 12:18:35 PM

我们可以根据我们的项目需求对上述所有示例进行不同的比较,例如 -gt(大于)、lt(小于)、-ge (大于或等于)或-le(小于或等于)。

这就是 powerShell 比较两个文件的 LastWriteTime 的全部内容。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯