【问题标题】:Powershell compare returned resultsPowershell 比较返回的结果
【发布时间】:2015-10-07 06:56:37
【问题描述】:

我目前有一个 Power Shell 脚本,它使用 WMI 向计算机查询服务标签/序列号,然后使用 SOAP 请求查询戴尔网站以获取保修信息。问题是对于某些计算机,我在查询中收到多个结果,而不是单个保修日期。我需要做的是能够比较返回的值以获得正确的保修信息。我认为我需要将返回的结果解析为一个数组,然后进行比较,但我不确定。任何帮助表示赞赏。

$c = 'localhost'
$service = New-WebServiceProxy -Uri https://xserv.dell.com/services/assetservice.asmx?WSDL
$system = Get-WmiObject -ComputerName $c win32_bios -ErrorActionSilentlyContinue
$serial =  $system.serialnumber
$guid = [guid]::NewGuid()
$info = $service.GetAssetInformation($guid,'check_warranty.ps1',$serial)
$info | Select-Object -ExpandProperty entitlements | Where-Object {$_.ServiceLevelCode -eq "SV" -or $_.ServiceLevelCode -eq "TS"}

这是单台计算机的返回结果:

ServiceLevelCode: TS
ServiceLevelDescription : ProSupport
Provider                : DELL
StartDate               : 8/8/2014 12:00:00 AM
EndDate                 : 8/7/2016 12:00:00 AM
DaysLeft                : 306
EntitlementType         : Active

ServiceLevelCode        : TS
ServiceLevelDescription : ProSupport
Provider                : DELL
StartDate               : 8/7/2013 12:00:00 AM
EndDate                 : 8/7/2014 12:00:00 AM
DaysLeft                : 0
EntitlementType         : Expired

【问题讨论】:

    标签: powershell powershell-3.0


    【解决方案1】:

    也许您应该只获得有效的保修?我也有戴尔机器,但我不知道是否会有更多有效的机器。如果有,您仍然应该期待更多的结果。所以你可以试试这个:

    $info | Select-Object -ExpandProperty entitlements | 
        Where-Object {$_.ServiceLevelCode -in "SV","TS" -and $_.EntitlementType -eq "Active"} | 
        Select-Object -ExpandProperty EndDate 
    

    您也可以进行排序并选择最新的。还是很难说。如果只有一个有效的权利,那就没问题了。

    $info | Select-Object -ExpandProperty entitlements | 
        Where-Object {$_.ServiceLevelCode -eq "SV" -or $_.ServiceLevelCode -eq "TS"} | 
        Sort-Object -Property @{Expression=[datetime]$_.EndDate} |
        Select -First 1
    

    【讨论】:

    • 谢谢马特,很遗憾我不知道如何获得有效保修。我认为对我来说关键是找到一种方法来比较返回结果的结束日期并选择最新日期,即 8/7/2016 12:00:00 AM 比 8/7/2014 12 更新:00:00 AM
    • @Raproductions 这正是他的Sort 方法所做的。它根据EndDate 属性对结果进行排序并选择第一个。
    • @Raproductions $_.EntitlementType -eq "Active" 获得有效且有效的保证。它是您在问题中显示的属性。除第二个代码外,获取具有最新结束日期的条目。因此,理论上该日期是您获得某种形式保修的最后日期。我的问题是戴尔保修有多种形式。
    • @Matt 我同意你的观点,但你仍然希望收到保修到期的结果。
    • @Raproductions 我对您想要什么感到困惑,因为您似乎只想要其中一个结果。既然结果已经是一个数组,你想做什么?
    【解决方案2】:

    这是我过去从我目前管理的 95% 的戴尔计算机中获得戴尔保修的内容。我接受了这个并为每个部分创建了一个函数,然后使用该函数将数据拉入我们用于库存的 SQL 表中。

    $serviceTag = [string]$SerialNumber = (Get-WmiObject -Namespace "root\cimv2" -Class Win32_SystemEnclosure).SerialNumber
    $WebProxy = New-WebServiceProxy -Uri 'http://xserv.dell.com/services/AssetService.asmx?WSDL' -UseDefaultCredential
    $WebProxy.Url = 'http://xserv.dell.com/services/AssetService.asmx'
    $WarrantyInformation = $WebProxy.GetAssetInformation(([guid]::NewGuid()).Guid, "Dell Warranty", $serviceTag)
    $WarrantyInformation | Select-Object -ExpandProperty Entitlements | Where-Object {$_.ServiceLevelCode -eq "SV" -or $_.ServiceLevelCode -eq "TS"} | ForEach-Object {
    $StartDate=[datetime]$_.StartDate 
    $EndDate=[datetime]$_.EndDate
    [string]$Provider=$_.Provider
    [string]$DaysLeft=$_.DaysLeft
    [string]$Status=$_.EntitleMentType
    $warrantydays = New-TimeSpan -start $StartDate -end $EndDate 
    if ($warrantydays.Days -gt 366){
     write-host ("Provider: "+ $Provider)
     write-host ("Status: " + $Status)
     write-host ("Days Left: " + $DaysLeft)
     write-host ("Start Date: " + $StartDate)
     write-host ("End Date: " + $EndDate)
     }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      相关资源
      最近更新 更多