gpt4 book ai didi

powershell - Import-Csv数据解析到数组

转载 作者:行者123 更新时间:2023-12-02 23:07:53 24 4
gpt4 key购买 nike

我有一个CSV文件,其中某些单元格包含多行。我将使用此数据来比较从powershell获得的值。

这将返回对象之间的差异,但是值是相同的。

预期结果不应返回任何值,因为两个值相同。

CSV内容:

ValueSystem\CurrentControlSet\Control\ProductOptionsSystem\CurrentControlSet\Control\Server ApplicationsSoftware\Microsoft\Windows NT\CurrentVersion

Code:

PS> $data = Import-Csv .\tr.csv

PS> $data.Value
System\CurrentControlSet\Control\ProductOptions
System\CurrentControlSet\Control\Server Applications
Software\Microsoft\Windows NT\CurrentVersion

PS> $regval = ((Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\SecurePipeServers\winreg\AllowedExactPaths).machine | Out-String).Trim()

PS> $regval
System\CurrentControlSet\Control\ProductOptions
System\CurrentControlSet\Control\Server Applications
Software\Microsoft\Windows NT\CurrentVersion

PS> Compare-Object $data.Value $regval
System\CurrentControlSet\Control\ProductOptions... =>
System\CurrentControlSet\Control\ProductOptions... <=

PS> $Tostring = ($data.Value | out-string).Trim()

PS> Compare-Object $Tostring $regval

InputObject SideIndicator
----------- -------------
System\CurrentControlSet\Control\ProductOptions... =>
System\CurrentControlSet\Control\ProductOptions... <=


PS> $Tostring.Length
145

PS> $regval.Length
147

最佳答案

最可能的解释是:

  • CSV的多行值(从单个字段获取)包含仅LF(Unix风格)换行符
  • ,而从注册表值派生的字符串由于将Out-String应用于字符串数组而具有 CRLF(Windows风格)换行符

  • 最直接的解决方法是删除CR字符。从$regval(您可以在PowerShell中使用"`r"生成CR字符):
    # ...

    # Remove all CRs from $regval.
    # Note that not providing a replacement string (missing 2nd RHS operand)
    # default to the empty string, which effectively *removes* what was matched.
    $regval = $regval -replace "`r"

    # Should now work as expected.
    Compare-Object $data.Value $regval

    说:
  • 由于您只比较两个字符串对象,因此可以避免Compare-Object的开销,而只需使用-eq即可:
    $data.Value -eq $regVal
  • 或者,您可以将多行值拆分为行数组,然后分别进行比较。请注意,如果您使用正则表达式"`r?`n"或('\r?\n')来匹配换行符以进行拆分-匹配仅LF换行符和CRLF换行符-您无需删除CR字符。首先,甚至将Out-String应用于Get-ItemProperty HKLM:\...调用的数组输出;但是,使用问题中的变量值,您可以使用:
    # Newline-style-agnostic
    Compare-Object ($data.Value -split "`r?`n") ($regval -split "`r?`n")

    # Or, knowing that $data.Value has LF, and $regval CRLF
    Compare-Object ($data.Value -split "`n") ($regval -split "`r`n")

    # Or, by using the [string[]] array of registry values directly:
    $regvals = (Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\SecurePipeServers\winreg\AllowedExactPaths).machine
    Compare-Object ($data.Value -split "`n") $regvals


  • 至于你尝试了什么:

    $Tostring = ($data.Value | out-string).Trim()



    如果$data.Value是不带尾随换行符的单个字符串(无论是否嵌入了换行符),则上述操作是有效的禁止操作:
  • 已经是字符串的输入对象由Out-String按原样传递。
  • 尽管Out-String确实附加了结尾的CRLF换行符(在Windows上),但随后的.Trim()调用再次将其删除。
  • 关于powershell - Import-Csv数据解析到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55395101/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com