如何编写Powershell脚本来检查上次将文件添加到文件夹的时间?

时间:2019-06-12 15:12:04

标签: powershell loops recursion foreach report

我当前正在编写一个脚本,用于检查目录中的每个文件夹最后一次向每个文件夹写入文件的时间。我很难弄清楚如何获取上次将文件写入文件夹的时间,而不是仅仅检索文件夹的创建日期。

我尝试使用Poweshell的递归方法,但无法弄清楚如何正确设置它。现在,该脚本已成功将每个文件夹的名称打印到Excel电子表格,并且还打印了每个文件夹的上次写入时间,这是错误的信息。

$row = 2

$column = 1

Get-ChildItem "C:\Users\Sylveon\Desktop\Test"| ForEach-Object {     

    #FolderName
    $sheet.Cells.Item($row,$column) = $_.Name
    $column++
    #LastBackup
    $sheet.Cells.Item($row,$column) = $_.LastWriteTime
    $column++
    #Increment to next Row and reset Column
    $row++
    $column = 1
}

脚本的当前状态会将每个文件夹名称打印到报告中,但会给出文件夹的创建日期,而不是最后一次将文件写入该文件夹的时间。

2 个答案:

答案 0 :(得分:2)

以下应该可以获取当前目录中任何文件的最新编辑日期。

Get-ChildItem | Sort-Object -Property LastWriteTime -Descending | Select-Object -first 1 -ExpandProperty "LastWriteTime"

Get-ChildItem在您的目录中获取项目

Sort-Object -Property LastWriteTime -Descending按写时间排序,最新的优先

Select-Object -first 1 -ExpandProperty "LastWriteTime"获得列表中的第一个,然后获得其写入时间


我这样做是为了获取您要获取的数据。如果目录为空,最后一行为我们提供了一个空字符串,这对于Excel来说可能是最安全的,但是您也可以默认使用空字符串以外的其他内容,例如目录的创建日期:

$ChildDirs = Get-ChildItem | Where-Object { $_ -is [System.IO.DirectoryInfo] }
$EditNames = $ChildDirs | ForEach-Object Name
$EditTimes = $EditNames | ForEach-Object { @( (Get-ChildItem $_ | Sort-Object -Property LastWriteTime -Descending | Select-Object -first 1 LastWriteTime), '' -ne $null)[0] }

for($i=0; $i -lt $ChildDirs.Length; $i++) {
    Write-Output $EditNames[$i]
    Write-Output $EditTimes[$i]
}


要针对您正在执行的操作实施此操作,如果我正确理解了您的问题,请尝试以下操作:

$ChildDirs = Get-ChildItem | Where-Object { $_ -is [System.IO.DirectoryInfo] }
$EditNames = $ChildDirs | ForEach-Object Name
$EditTimes = $EditNames | ForEach-Object { @( (Get-ChildItem $_ | Sort-Object -Property LastWriteTime -Descending | Select-Object -first 1 LastWriteTime), '' -ne $null)[0] }

for($i=0; $i -lt $ChildDirs.Length; $i++) {
    #FolderName
    $sheet.Cells.Item($row, $column) = $EditNames[$i]
    $column++
    #LastBackup
    $sheet.Cells.Item($row, $column) = $EditTimes[$i]
    $row++
    $column = 1
}

答案 1 :(得分:0)

如果只查看每个文件夹中的第一级文件,则可以使用嵌套循环来实现:

$row = 2
$column = 1

$folders = Get-ChildItem $directorypath
ForEach ($folder in $folders) { 

    # start off with LastEdited set to the last write time of the folder itself
    $LastEdited = $folder.LastWriteTime
    $folderPath = $directoryPath + '\' + $folder.Name
    # this 'dynamically' sets each folder's path

    $files = Get-Childitem $folderPath
    ForEach ($file in $files) {
        if ((Get-Date $file.LastWriteTime) -gt (Get-Date $LastEdited)) {
            $LastEdited = $file.LastWriteTime
        }
    }

    $sheet.Cells.Item($row,$column) = $folder.Name
    $column++
    $sheet.Cells.Item($row,$column) = $LastEdited
    $row++
    $column = 1
}