从具有相同名称但不同扩展名的文件(*.pdf 和 *.rtf)中,如果 *.rtf 较新,则在控制台上输出消息

Posted

技术标签:

【中文标题】从具有相同名称但不同扩展名的文件(*.pdf 和 *.rtf)中,如果 *.rtf 较新,则在控制台上输出消息【英文标题】:From files with same name but different extension(*.pdf and *.rtf), if *.rtf is newer, output message on console 【发布时间】:2017-04-09 20:39:47 【问题描述】:

我的文件夹和子文件夹包含两个不同扩展名的文件。我需要检查两个对应文件的最后写入时间。 例如

file1.rtf
file1.pdf
file2.rtf
file2.pdf
file3.rtf
file3.pdf

...等等

我需要确保 RTF 文件在 PDF 文件之前运行。如果 PDF 早于 RTF,则表示这是一个错误。我需要在 powershell 控制台上输出这些文件名,并带有指示此错误的消息。任何帮助,将不胜感激。我试图找到并运行我在网上找到的不同代码,但没有任何效果。谢谢你。代码代码

$path = Read-Host "Enter Path"
$files = Get-ChildItem -Path $path -Filter "*.txt"            

$files | % 
    $rtf=$($_.BaseName+".rtf")
    If (Test-Path $rtf)
    If ($_.LastWritetime -lt (Get-Item $rtf).LastWriteTime)

    $file = $_.OpenText();            
    $lineNum = 1;            
    Write-Host "Checking file"$_.Name -f Yellow  "$_ is older than $rtf file"   ;            
    while($file.EndOfStream -ne $true)            
       
        $line = $file.ReadLine();                    
        if($line -ne $null)            
          
            if($line.ToLower().Contains("error") -or $line.ToLower().Contains("exception"))            
              
                Write-Host "Line: $lineNum " -NoNewline -ForegroundColor Green;            
                Write-Host $line -f Red;            
                        
                     

        $lineNum++;                   
                
            

 

【问题讨论】:

我期待的结果是,先比较 RTF 和 Txt 文件。然后开始解析 txt 文件中的关键字“error”(如果存在),写入 txt 文件名并在控制台上的 txt 文件中显示错误。如果 txt 文件在 RTF 文件之前运行,还要写入消息 txt 比 $rtf 文件旧。 我认为问题不在于 CD'ing 到路径。 $rtf 仅从没有路径的基本名称构建,因此 Test-Path 将失败,因为请求的文件不在当前路径中。 【参考方案1】:
Set-Location C:\Path\To\Files\
Get-ChildItem -Filter *.rtf |ForEach-Object 
    $pdf=$($_.BaseName+".pdf")
    If (Test-Path $pdf)
        If ($_.LastWritetime -gt (Get-Item $pdf).LastWriteTime)
            Write-Warning "$_ is newer than $pdf file"
        
    

【讨论】:

需要更多帮助!尽管 LotPings 代码运行良好。我需要将此代码添加到我正在为解析文件运行的另一个代码中。 在将时间戳与 RTF 进行比较后,最终将 Lotpings 代码添加到另一个代码以解析 txt 文件(而不是我前面提到的 PDF) 桑杰,这其实是一个新问题。为了引起注意,你应该这样说。这个问题已经有一个公认的答案。后续读者必须在 Q & A & cmets 之间跳转才能了解发生了什么。 我完全理解并且非常感谢您的建议。我会记住这一点并提出一个新问题。感谢 LotPings,如有任何不便,我们深表歉意。我是这个系统的新手。我今天会提出新问题。【参考方案2】:

您可以使用Group-Object cmdlet 按文件的基本名称(不带扩展名的文件名)对文件进行分组,然后查看每个组中哪个最旧:

Get-ChildItem C:\Path\To\Files\* -Include *.pdf,*.rtf |Group-Object BaseName |ForEach-Object 
    if($_.Count -lt 2)
        Write-Warning "Only $($_.Group[0].Name) is present"
    
    else
        $Oldest = $_.Group |Sort-Object LastWriteTime |Select-Object -First 1
        if($Oldest.Extension -eq '.pdf')
            Write-Warning "$($Oldest.Name) is older than RTF file"
        
    

【讨论】:

嗨,马蒂亚斯!我真的很感谢你的快速反应。太棒了。虽然它没有给我完整的结果,但 mklement0 所做的添加工作完全正常。我非常感谢您的帮助。如果需要,我会与您联系,因为我正在将此代码合并到另一个代码中。再次感谢你们俩。 代码运行良好!但问题是,当其中一个文件丢失或不可用时,它会给出错误的结果。例如,如果 .rtf 丢失,代码会自动将 pdf 视为旧版本,如果 PDF 丢失,我根本不会收到任何警告,并且这些单个文件将被跳过。有什么方法可以先检查两个文件是否可用。如果缺少一个,我们可以输出警告指示哪个文件丢失,当然如果两者都可用,则执行我们已经在做的事情。感谢您的帮助。 @Sanjay 更新了 sn-p 测试每个组中是否包含少于 2 个文件

以上是关于从具有相同名称但不同扩展名的文件(*.pdf 和 *.rtf)中,如果 *.rtf 较新,则在控制台上输出消息的主要内容,如果未能解决你的问题,请参考以下文章

视频转换后如何命名输出文件与输入文件相同但扩展名不同? [复制]

从不同目录中具有相同名称的文件进行归档

防止从 ZipOutPutStream 中删除重复项

标题与标准标题具有相同名称但大小写不同的问题

如何将输出文件命名为与输入文件相同但视频转换后的扩展名不同? [重复]

唯一标识名称和大小相同但内容不同的文件