查找文件/文件夹的修改日期

43

我对PowerShell非常陌生,希望能得到一些帮助创建一个脚本,告诉我文件的修改日期。

我希望我更了解PowerShell,因为我感觉我正在提出很多问题(这个星期我所有的空闲时间都将用于更好地学习PowerShell)。指导我学习如何做这个的方向也将非常有帮助。

这是完整的情况说明:我需要每天运行一个报告,检查90个不同商店列表中的计算机是否执行了某个特定的备份。修改日期应该表明备份是否已经完成,并且会被设置为前一天的日期。

如果修改日期是昨天,那么就不需要输出任何内容。如果不是昨天,我希望在PowerShell窗口或文本文件中输出,哪个更容易就用哪个。

我还必须检查每个90个商店的文件夹是否超过7天了,对于输出也有相同的条件。我对于每个商店的想法是像这样:

对于商店1:

Check file date for \\server\store\computer\c:\folder\"newest modified date in folder"
if date equals yesterday
   then do nothing
if date does not equal yesterday
   then output "Test did not backup"

check folder modified date for \\server\sample\store\backupfolder
if date equals <7 days old
   then do nothign
if date equals >7 days old
   then output "test did not backup"

非常抱歉我没有证明我的研究努力,我对PowerShell非常陌生,并且我必须在截止日期之前完成这项工作。昨天以来,我已经学会了如何使用脚本完成我需要做的一切。感谢@Keith指导我走上正确的道路。最终,我使用以下代码实现了我的目标,仅输出结果为false的位置。

$a = Get-ChildItem \\server\XXX\Received_Orders\*.* | Where{$_.LastWriteTime -ge (Get-Date).AddDays(-7)}
if ($a = (Get-ChildItem \\server\XXX\Received_Orders\*.* | Where{$_.LastWriteTime -ge (Get-Date).AddDays(-7)}))
{
}
Else
{
    'STORE XXX HAS NOT RECEIVED ANY ORDERS IN THE PAST 7 DAYS'
}


$b = Get-ChildItem \\COMP NAME\Folder\*.* | Where{$_.LastWriteTime -ge (Get-Date).AddDays(-1)}
if ($b = (Get-ChildItem \\COMP NAME\TFolder\*.* | Where{$_.LastWriteTime -ge (Get-Date).AddDays(-1)}))
{
}
Else
{
    'STORE XXX DID NOT RUN ITS BACKUP LAST NIGHT'
}

能否请楼主重构一下这个问题?也许可以将其简化并易于阅读一些? - SAm
5个回答

74
如果运行Get-Item或Get-ChildItem命令,则会输出包含此信息的System.IO.FileInfo和System.IO.DirectoryInfo对象,例如:

System.IO.FileInfoSystem.IO.DirectoryInfo

Get-Item c:\folder | Format-List  

或者您可以直接访问该属性,像这样:

Get-Item c:\folder | Foreach {$_.LastWriteTime}

要根据最后写入时间开始过滤文件夹和文件,可以这样做:

Get-ChildItem c:\folder | Where{$_.LastWriteTime -gt (Get-Date).AddDays(-7)}

6
如果您使用的是PowerShell 3,则Test-Path命令拥有NewerThan和OlderThan选项。 - Eris
非常感谢@Keith,凭借这些项目,我能够确定我将使用以下命令:Get-ChildItem c:\folder\*.* Where{$._LastWrittenTime -lt (Get-Date).AddDays(-8)}Get-ChildItem c:\folder\*.* Where{$._LastWrittenTime -gt (Get-Date).AddDays(-1)}。我现在正在研究如何输出信息,以便我们可以看到哪些商店未能通过这个测试中的一个或两个命令中的90个失败。 - Seth Little
1
@Eris,说得好。由于长期使用Where谓词进行此类过滤,我一直忘记了该功能是作为动态参数添加到Test-Path中的。 - Keith Hill
我正在寻找一个类似于Linux的stat命令的命令,而Get-Item正是我所需要的。请注意,它可以缩写为gi,这样您就需要输入更少的字符。 - ha7ilm

31

要获取单个文件的修改日期,请尝试:

$lastModifiedDate = (Get-Item "C:\foo.tmp").LastWriteTime

与另一个进行比较:

$dateA= $lastModifiedDate 
$dateB= (Get-Item "C:\other.tmp").LastWriteTime

if ($dateA -ge $dateB) {
  Write-Host("C:\foo.tmp was modified at the same time or after C:\other.tmp")
} else {
  Write-Host("C:\foo.tmp was modified before C:\other.tmp")
}

2
简单、清晰,正是我所需要的:我有路径的全名作为字符串。干得好! - loved.by.Jesus

0

这是对我有效的方法:

$a = Get-ChildItem \\server\XXX\Received_Orders\*.* | Where{$_.LastWriteTime -ge (Get-Date).AddDays(-7)}
if ($a = (Get-ChildItem \\server\XXX\Received_Orders\*.* | Where{$_.LastWriteTime -gt (Get-Date).AddDays(-7)}  
#Im using the -gt switch instead of -ge
{}
Else
{
'STORE XXX HAS NOT RECEIVED ANY ORDERS IN THE PAST 7 DAYS'
}


$b = Get-ChildItem \\COMP NAME\Folder\*.* | Where{$_.LastWriteTime -ge (Get-Date).AddDays(-1)}
if ($b = (Get-ChildItem \\COMP NAME\TFolder\*.* | Where{$_.LastWriteTime -gt (Get-Date).AddDays(-1)))}
{}
Else
{
'STORE XXX DID NOT RUN ITS BACKUP LAST NIGHT'
}

0

你可以尝试使用dirTimesJS.batfileTimesJS.bat

例如:

C:\>dirTimesJS.bat %windir%

directory timestamps for C:\Windows :

Modified : 2020-11-22 22:12:55
Modified - milliseconds passed : 1604607175000
Modified day of the week : 4

Created : 2019-12-11 11:03:44
Created - milliseconds passed : 1575709424000
Created day of the week : 6

Accessed : 2020-11-16 16:39:22
Accessed - milliseconds passed : 1605019162000
Accessed day of the week : 2

C:\>fileTimesJS.bat %windir%\notepad.exe

file timestamps for C:\Windows\notepad.exe :

Modified : 2020-09-08 08:33:31
Modified - milliseconds passed : 1599629611000
Modified day of the week : 3

Created : 2020-09-08 08:33:31
Created - milliseconds passed : 1599629611000
Created day of the week : 3

Accessed : 2020-11-23 23:59:22
Accessed - milliseconds passed : 1604613562000
Accessed day of the week : 4

-1
PowerShell 代码以查找最近 2 天修改的所有文档库文件。
$web = Get-SPWeb -Identity http://siteName:9090/ 
        $list = $web.GetList("http://siteName:9090/Style Library/")
        $folderquery =  New-Object Microsoft.SharePoint.SPQuery  
        $foldercamlQuery =  
        '<Where>   <Eq> 
                <FieldRef Name="ContentType" />  <Value Type="text">Folder</Value> 
            </Eq> </Where>' 
        $folderquery.Query = $foldercamlQuery 
        $folders = $list.GetItems($folderquery) 
        foreach($folderItem in $folders) 
        { 
            $folder = $folderItem.Folder
            if($folder.ItemCount -gt 0){ 
            Write-Host " find Item count " $folder.ItemCount
                $oldest = $null
                $files = $folder.Files

                $date = (Get-Date).AddDays(-2).ToString(“MM/dd/yyyy”)
                foreach ($file in $files){ 
                    if($file.Item["Modified"]-Ge $date)
                    {
                        Write-Host "Last 2 days modified folder name:"   $folder   " File Name: "  $file.Item["Name"]   " Date of midified: "  $file.Item["Modified"] 
                    } 
                } 
            } 
            else
             { 
                Write-Warning "$folder['Name'] is empty" 
            } 
        }

1
这个问题似乎不是关于 SharePoint 内部文档的。 - Patric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接