PowerShell 代码返回的值多于预期 -GREP

问题描述 投票:0回答:1

晚上好。 Stack Overflow 和 Powershell 新手在这里。

Powershell 中的以下代码返回的值比我想要的要多。例如,它捕获 JSON 文件中与 PPVCOUNT 匹配的变量,以及以 PPVCount 字符串前后的字符命名的变量。示例:

PPVCountAtInception

操作员计数大于 PPVCountIndicator

目标:我的目标是让代码仅返回变量 PPVCount。我还想保留以下列:Pattern、LineNumber、Line。请原谅我的知识匮乏,并提前感谢您

$file = 'C:\\Users\\B187515\\Downloads\\j.json'
$PPVCount="PPVCount"

Get-Content $file | Select-String -Pattern $PPVCount -Context 1| Select-Object Pattern,LineNumber, Line -ExpandProperty Context -First 18 | Format-Table | Out-file -FilePath 'C:\\Users\\B187515\\Downloads\\test.csv' -Append

预期结果:

我的目标是让代码仅返回 CSV 文件中的变量“PPVCount”。 我还想保留这些列:Pattern、LineNumber、Line

实际结果 有多个变量返回变量名称中某处包含“PPVCount”。请参阅 CSV 的屏幕截图 在此输入图片描述

powershell grep select-string select-object
1个回答
0
投票

以有用的评论为基础:

$file = 'C:\Users\B187515\\Downloads\j.json'
# Enclose the property name in embedded "..."
$searchRegex ='"PPVCount"'

Select-String -LiteralPath $file -Pattern $searchRegex -Context 1 | 
  Select-Object Pattern, LineNumber, Line -ExpandProperty Context -First 18 | 
  Export-Csv -LiteralPath 'C:\Users\B187515\Downloads\test.csv'
  • 您的意图是查找字符串

    PPVCount
    作为单独的单词;由于您似乎正在寻找此字符串作为 JSON 属性名称,因此您可以假设它包含在嵌入的
    "..."
    中,因此可以使其成为搜索字符串的一部分。

    • 由于这相当于literal搜索,您可以添加

      -SimpleMatch
      开关,这可能会提高性能。

    • 通常,要查找仅由字母、数字或

      _
      作为单独单词组成的标记,您可以使用 word-boundary assertions 又名 anchor,这是一个 regex 功能,因此需要您使用
      -SimpleMatch
      ),所以您的情况的替代方案是使用
      $searchRegex ='\bPPVCount\b'

  • 由于您的目的是创建 CSV 文件,因此请使用

    Export-Csv
    来创建它。

    • 至于您使用的内容:

      Format-Table
      Out-File
      都为人类观察者创建数据表示,这就是为什么您永远不应该使用它们来打印数据以进行编程处理 - 请参阅这个答案更多信息。

    • 字符编码警告:在 Windows PowerShell(直至 v5.1 的版本)中,

      Export-Csv
      莫名其妙地默认为 ASCII(!) 编码;而在 PowerShell (Core) 7 中,它是值得称赞的无 BOM UTF-8。根据需要使用
      -Encoding
      参数,但请注意,
      -Encoding utf8
      始终会在 Windows PowerShell 中创建带有BOM 的 UTF-8 文件。

  • 一些旁白:

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.