从具有相同名称但不同扩展名的文件(*.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 较新,则在控制台上输出消息的主要内容,如果未能解决你的问题,请参考以下文章
视频转换后如何命名输出文件与输入文件相同但扩展名不同? [复制]