【问题标题】:Get Computer Manufacture Date by evaluate CPU Dates from a csv file using Powershell WMI通过使用 Powershell WMI 从 csv 文件评估 CPU 日期来获取计算机制造日期
【发布时间】:2019-07-11 00:10:30
【问题描述】:

我正在尝试通过查找带有处理器日期列表的 csv 文件并在计算机的处理器日期与 csv 列表中填充的日期匹配时返回日期来输出计算机制造日期。我试图通过使用 import-csv cmdlet 来实现这一点,该 cmdlet 将从带有预填充处理器模型及其 Date 对象的 excel 工作表中导入 csv 文件。下面发布了此 CSV 文件的示例。然后,包含此命令的 powershell 脚本将根据标题行进行查找和比较,然后根据匹配或条件是否满足提供正确的日期。

到目前为止,我的代码返回所有发布日期而不是匹配的日期。这不是预期的结果。

这是我的脚本示例

$OutModel = Get-WmiObject Win32_Processor | Select name

Import-Csv C:\date_source\manufacture_date.CSV -Delimiter ";"  | where {$_.Name -ne ""} | %{write-host The Manufacture Date is: $_.Release}

这是我的导入 Csv 文件的示例

Model;Release;;;;;;;;

;;;;;;;;;

i7-8086K ;Q2 2018;;;;;;;;

i7-8700K;Q4 2017;;;;;;;;

i7-8700;Q4 2017;;;;;;;;

i5-8600K;Q4 2017;;;;;;;;

i5-8500;Q2 2018;;;;;;;;

i5-8400;Q4 2017;;;;;;;;

i3-8350K;Q4 2017;;;;;;;;

i3-8100;Q4 2017;;;;;;;;

Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz;Q3 2017;;;;;;;;

i7-8550U;Q3 2017;;;;;;;;

i7-8750H;Q2 2018;;;;;;;;

i5-8350U;Q3 2017;;;;;;;;

i5-8300H;Q2 2018;;;;;;;;

i5-8250U;Q3 2017;;;;;;;;

i7-8665U;Q2 2019;;;;;;;;

i7-8565U;Q3 2018;;;;;;;;

i5-8365U;Q2 2019;;;;;;;;

i5-8265U;Q3 2018;;;;;;;;

i3-8145U;Q3 2018;;;;;;;;

我期待类似“制造日期:2018 年第二季度”之类的内容......一行。 一些代码 sn-ps 或代码想法以获得确切的预期输出将不胜感激。

【问题讨论】:

    标签: powershell csv cpu get-wmiobject


    【解决方案1】:

    这里有一种稍微不同的方法。 [grin] 它使用查找表使事情变得更明显 - 并且比使用过滤器快一点。

    # fake reading in a CSV file
    #    in real life, use Import-CSV
    $CPU_Data = @'
    Model;ReleaseDate
    i7-8086K;Q2 2018
    i7-8700K;Q4 2017
    i7-8700;Q4 2017
    i5-8600K;Q4 2017
    i5-8500;Q2 2018
    i5-8400;Q4 2017
    i3-8350K;Q4 2017
    i3-8100;Q4 2017
    Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz;Q3 2017
    i7-8550U;Q3 2017
    i7-8750H;Q2 2018
    i5-8350U;Q3 2017
    AMD Phenom(tm) II X4 945 Processor;Q4 2009
    '@ | ConvertFrom-Csv -Delimiter ';'
    
    # build a lookup table
    $CPU_ReleaseDateLookup = [hashtable]::new()
    foreach ($CD_Item in $CPU_Data)
        {
        $CPU_ReleaseDateLookup.Add($CD_Item.Model, $CD_Item.ReleaseDate)
        }
    
    # the CIM cmdlets are a tad faster than the WMI cmdlets - and are not deprecated
    $CPU_Name = (Get-CimInstance -ClassName CIM_Processor).Name
    
    
    'The release date for [ {0} ] is [ {1} ].' -f $CPU_Name, $CPU_ReleaseDateLookup[$CPU_Name]
    

    输出...

    The release date for [ AMD Phenom(tm) II X4 945 Processor ] is [ Q4 2009 ].
    

    【讨论】:

    • 经过测试并按预期工作。我在填充我的 CSV 后注意到一件事,我必须复制我计算机上的确切 CPU 名称,然后才能正确读取它,而这样做的缺点是因为我不是每个人的计算机都和我一起检查 @what ghz 的速度他们喜欢在我的情况下@ 1.9 ghz 有没有一种方法我可以通过从处理器名称中挑选出重要的字符串(例如 i7-8086K)然后忽略然后将其余的字符串作为匹配项来查找? .参考下面的内容..
    • 我也在考虑其他条件,以防硬件在哈希表中找不到匹配项。否则我将不得不暂时解决这个问题。
    • 如果我能匹配 intel 网站上的这种格式就好了 -> 。 Intel(R) Core(TM) i7-8086K 处理器;2018 年第 2 季度或为此与我计算机上的相同 -> 。 Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz 。 ;Q3 2017 我可以匹配这个 i7-8660U 并去掉(忽略)其余部分 ;Q2 2019
    • @johnzuh - 只有几种方法可以匹配 CIM/WMI 调用和查找表中存在的文本。我使用了 CIM 调用返回的全部内容。您可以调用英特尔站点,从中构建一个表,然后使用$Keys -match $CPU_Info 获取要在哈希表调用中使用的密钥。您可能希望简单地将 CIM CPU 名称信息构建到表中,并让低级技术人员手动输入发布日期信息。 [grin] 这主要是一次完成的情况,手动完成可能会更快。 [叹息...]
    • # 我确实在“”(空格)上拆分了字符串,它删除了空格之前、之后的所有字符,并仅使用 [2] 元素返回特定的模型,例如$CPU_Model = $CPU_Name.Split(" ")[2] 返回 i7-8650U,然后我将其与表中的相应日期匹配。 Kinda 即兴发挥了我想在这里实现的目标,因此我不必匹配 CIM 返回的整个 Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz。欣赏
    【解决方案2】:

    运行以下命令可以轻松获得您想要的结果。不是最好的方法,但肯定是一种方法

    $models = import-csv C:\temp\modeltest.csv -Delimiter ";" 
    $CPU = $(((Get-WmiObject Win32_Processor | Select name) -split ' ')[2])
    Write-Host "The Manufacture Date is : $(($models.Where({$_.Model -eq "$CPU"})).Release)"
    

    【讨论】:

    • 感谢,我也从您建议的方法中得到启发。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 2021-02-02
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    相关资源
    最近更新 更多