如何在powershell中获取系统对象数组中的最后一个条目

djmepvbi  于 2023-08-05  发布在  Shell
关注(0)|答案(1)|浏览(93)

我使用以下命令在C:\tmp中生成一个日志文件,命名约定为computername_yearmmddhhmm.txt

/xagt.exe -g "C:\tmp\xagt_${env:COMPUTERNAME}_$(Get-Date -Format 'yyyyMMdd_HHmmss').txt"

字符串
要使用PowerShell读取此文件的输出,我使用下面随附的代码,要获取日志文件的最后20行,我使用下面的代码

$Fireeyefilename = Get-Item  $filename*.txt

Write-Output ("FireEye Connection Status");
Write-Host "-------------------------------------------------------------------------------------------------------"
$foreeyeconnection = Get-Content $Fireeyefilename[$Fireeyefilename.count – 1] -Tail 20 | select-string "m=TCPConnect";
Write-Output ("$($Fireeyefilename[$Fireeyefilename.count – 1])");
Write-Output ("$foreeyeconnection");


如上所示,我将部分文件名保存在变量$filename中,然后将使用命名约定xagt_hostname_*创建的所有日志文件存储在变量$Fireeyefilename中,然后使用Get-Content读取该文件的内容。
问题是有时变量($Fireeyefilename)包含一个这样的日志文件

PS C:\Program Files (x86)\FireEye\xagt> $Fireeyefilename

    Directory: C:\tmp

Mode                LastWriteTime         Length Name                                                                                                                    
----                -------------         ------ ----                                                                                                                    
-a----       13/07/2023     10:58        8416798 xagt_computername_20230713_105844.txt                                                                                       


PS C:\Program Files (x86)\FireEye\xagt> $Fireeyefilename.GetType()

IsPublic IsSerial Name                                     BaseType                                                                                                      
-------- -------- ----                                     --------                                                                                                      
True     True     FileInfo                                 System.IO.FileSystemInfo


并且$Fireeyefilename变量类型变为System.IO.FileSystemInfo
有时候$Fireeyefilename变量有多个日志文件,变量类型会变成一个系统数组,如:

PS C:\Program Files (x86)\FireEye\xagt> $Fireeyefilename.GetType()

IsPublic IsSerial Name                                     BaseType                                                                                                      
-------- -------- ----                                     --------                                                                                                      
True     True     Object[]                                 System.Array                                                                                                  


PS C:\Program Files (x86)\FireEye\xagt> $Fireeyefilename

    Directory: C:\tmp

Mode                LastWriteTime         Length Name                                                                                                                    
----                -------------         ------ ----                                                                                                                    
-a----       13/07/2023     10:58        8416798 xagt_computername_20230713_105844.txt                                                                                       
-a----       13/07/2023     11:03        8428108 xagt_computername_20230713_110307.txt                                                                                       
-a----       13/07/2023     11:03        8428108 xagt_computername_20230713_110337.txt


我需要读取我生成的最后一个日志文件,换句话说,文件最近的“LastWriteTime”,所以我使用以下代码:

Get-Content $Fireeyefilename[$Fireeyefilename.count – 1] -Tail 20 | select-string "m=TCPConnect";


正如我前面提到的,当变量$Fireeyefilename有一个单一的文件名,它的类型是system.IO.FileSystemInfo,它将没有Count属性,但代码工作,当变量$Fireeyefilename类型是System.Array,我得到了最后一个文件使用

Get-Content $Fireeyefilename[$Fireeyefilename.count – 1] -Tail 20 | select-string "m=TCPConnect";


有时候我无法获得使用以下代码生成的最后一个日志文件:

Get-Content $Fireeyefilename[$Fireeyefilename.count – 1]


那么是否有一个mmethod来获取系统数组变量Last$Fireeyefilename中包含LastWriteTime的最后一个日志文件
考虑到我应该在C:\tmp位置生成此文件,为什么有同名的日志文件,因为很多用户必须在同一位置生成此文件,是否有增强代码的建议,请让我知道

kuarbcqp

kuarbcqp1#

您可以使用@(...)数组子表达式运算符强制PowerShell将单项输出视为数组:

# use @() to ensure `$FireEyeLogFiles` contains an array, 
# regardless of whether there's 0, 1, or multiple files
$FireEyeLogFiles = @(Get-Item $filename*.txt)

# index `-1` will give you the last item in the array
$latestFireEyeLogFile = $FireEyeLogFiles[-1] 
if (-not $latestFireEyeLogFile) {
  Write-Warning "No log files found!"
}
else {
  $latestFireEyeLogFile |Get-Content -Tail 20 |Select-String -Pattern 'm=TCPConnect'
}

字符串

相关问题