json 解析文件并使用PowerShell获取特定行的值

yzckvree  于 4个月前  发布在  Shell
关注(0)|答案(1)|浏览(73)

我有一个脚本,运行在订阅中的Azure VM列表上,并为每个VM输出一个文件,下面是其内容的示例:

Value[0]        : 
  Code          : ComponentStatus/StdOut/succeeded
  Level         : Info
  DisplayStatus : Provisioning succeeded
  Message       :     Directory: C:\variasuit_windows\HARMOR\windows_server\package

Mode                LastWriteTime         Length Name                                                                  
----                -------------         ------ ----                                                                  
d-----       12/23/2023   5:10 AM                HARMOR                                                                
"Server Name","GPO_HARMOR","BIOMEDIC_AGENT","EDWARD_STATUS","SENSOR_STATUS","SENTINEL_STATUS"
"AZ-TSTAPP1D","OK","OK","OK","OK","KO"

Value[1]        : 
  Code          : ComponentStatus/StdErr/succeeded
  Level         : Info
  DisplayStatus : Provisioning succeeded
  Message       : 
Status          : Succeeded
Capacity        : 0
Count           : 0

字符串
我想使用powershell来解析这个文件,以获得这一行:

"AZ-TSTAPP1D","OK","OK","OK","OK","KO"


然后将每个文件中的值收集到另一个txt文件中,

"AZ-TSTAPP1D","OK","OK","OK","OK","KO"
"AZ-TSTAPP2D","OK","KO","KO","KO","KO"
"AZ-TSTAPP3D","OK","OK","OK","OK","KO"


我试图得到这一特定行的内容,但我发现行号可以从一个文件到另一个改变
我试过这个:

$scriptResult = Invoke-AzVMRunCommand -ResourceGroupName $vm.ResourceGroupName -VMName $vm.Name -CommandId 'RunPowerShellScript' -ScriptPath $scriptPath

        $scriptResult | Out-File $tempFile
        $contentFromFile = Get-Content -Path $tempFile
        $line12 = $contentFromFile | Select-Object -Index 11
        $line12 | Out-File $outputFile -Append
        Remove-Item $tempFile


任何帮助请?
谢谢

2guxujil

2guxujil1#

总的来说:

  • 我不知道Invoke-AzVMRunCommand是否能够中继(串行化)对象,但如果是的话,你最好在对象上操作,而不是在它们的 * for-display字符串表示 * 上操作。

至于你的代码:

  • 您不需要临时文件,并且可以使用Out-String-Stream参数来逐行获取用于显示的格式化表示;如果Invoke-AzVMRunCommand只发出 text,那么您甚至不需要它。
  • 您可以使用-match运算符和regex来过滤掉感兴趣的行。
  • 您可以使用>>redirection运算符作为管道连接到Out-File-Append的快捷方式。
@($scriptResult | Out-String -Stream) -match '^"AZ-TSTAPP' >> $outputFile

字符串
上面的正则表达式被证明不够具体;根据你的评论,这是你想出的适合你的正则表达式:

@($scriptResult | Out-String -Stream) -match '^".*AZ-.*",".*",".*",".*"$' >> $outputFile

相关问题