Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 从名称相同但扩展名不同的文件(*.pdf和*.rtf),如果*.rtf较新,则在控制台上输出消息_Powershell - Fatal编程技术网

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

Powershell 从名称相同但扩展名不同的文件(*.pdf和*.rtf),如果*.rtf较新,则在控制台上输出消息,powershell,Powershell,我有两个不同扩展名的文件夹和子文件夹。我需要检查两个相应文件的上次写入时间。 比如说 file1.rtf file1.pdf file2.rtf file2.pdf file3.rtf file3.pdf 。。。等等 我需要确保RTF文件在PDF文件之前运行。如果PDF文件比RTF文件旧,这意味着它是一个错误。我需要在powershell控制台上输出这些文件名,并显示一条指示此错误的消息。任何帮助都将不胜感激。我试图找到并运行我在网上找到的不同代码,但没有任何效果。非常感谢。密码,密码 $pa

我有两个不同扩展名的文件夹和子文件夹。我需要检查两个相应文件的上次写入时间。
比如说

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++;                   
    }            
}            
}
} 

您可以使用
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更新了代码段,以测试每个组中是否包含少于2个文件。需要更多帮助!尽管LotPings代码工作得非常好。我需要将此代码添加到我正在运行的另一个用于解析文件的代码中。将Lotpings代码添加到另一个用于解析txt文件(而不是我前面提到的PDF)的代码中最终在将时间戳与RTFSanjay进行比较之后,这实际上是一个新问题。为了引起注意,你应该这样说。这个问题已经有了公认的答案。后续读者必须在问答和评论之间跳来跳去,才能理解发生了什么。我完全理解,也非常感谢你的建议。我将牢记这一点,并提出一个新问题。谢谢你们,抱歉给你们带来不便。我是这个系统的新手。今天我将提出一个新问题。我期待的结果是,首先比较RTF和Txt文件。然后开始解析txt文件中的关键字“error”(如果存在),在控制台上从txt文件中写入txt文件名和带有error的行。如果txt文件在RTF文件之前运行,请同时写入消息txt早于$RTF文件。我认为问题不在于CD'ing到路径。$rtf仅从基本名称生成,没有路径,因此测试路径将失败,因为请求的文件不在当前路径中。
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"
        }
    }
}