Powershell 将变量存储在哈希表中并稍后解析该值

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

首先我要说的是,我相当确定我没有使用正确的术语,所以请在需要时纠正我。

情况是这样的,我是一名业余无线电操作员,我有多个无线电,我用不同的软件对其进行编程(Chirp 并不支持我的所有无线电)。这两个应用程序都有一个“导出为 CSV”选项。当我在 Chirp 中导出时,列标题为:位置、名称、频率、音调、rToneFreq、cToneFreq。当我从 RT Systems 导出时,列标题分别为:通道号、名称、接收频率、音调模式、CTCSS、Rx CTCSS。正如您所看到的,几个列标题不匹配。 我编写了一个 Powershell 脚本,用于导入 CSV(使用 Convertfrom-csv 函数,以便我可以按名称访问属性),以便我可以比较条目以确保如果我在无线电的多个位置定义了频道,一切都一样。这是输出的示例:

Name = MANTIW Freq = 146.720000 Tone = 100.0 Location Name Frequency Tone rToneFreq cToneFreq Comment -------------------------------------------------- 115 MANTIW 146.720000 Tone 100.0 100.0 Skyline ARC 392 GLNDLE 146.720000 Tone 100.0 100.0 Skyline & Sinbad link? 410 MANTIW 146.720000 Tone 100.0 100.0 Skyline ARC

这告诉我,我为名称不匹配的多个通道定义了 146.720,音调为 100.0。然后我可以看一下并说可以,或者根据需要更改名称。

基本上,对于 $csv var 中的每个项目,我设置频率、音调和名称,然后我说给我该 var 中具有相同频率和音调的所有条目,然后选择唯一的名称。如果计数大于 1,请将其写入我的文件以供审核。

这一切都运行良好。我将它与一台收音机一起使用,发现有很多差异需要解决。然后我转向另一台使用 RT Systems 软件进行编程的收音机,这就是我的问题出现的地方。

出于维护原因,我不想为每个收音机使用单独的脚本。我的脚本中已包含以下代码,用于确定输出是针对一台收音机还是另一台:

if ($csv| Get-member | select-object -ExpandProperty Name | ? {$_ -eq "Receive Frequency"}) { $radio = "A" } elseif ($csv | Get-member | select-object -ExpandProperty Name | ? {$_ -eq "Frequency"}) { $radio = "B" }

我希望做的是定义某种方式来说明如果我使用无线电 A,则查询 $
.“接收频率”,但如果我使用无线电 B,则查询 $

.频率。这样,我在该点以下的查询就可以保持不变,并且我不需要为每个无线电进行自定义查询。我最初尝试过类似的事情: if ($csv| Get-member | select-object -ExpandProperty Name | ? {$_ -eq "Receive Frequency"}) { $radio = "8600" $details = @{ $freq = $_."Receive Frequency" $tone = $_.CTCSS $name = $_.Name } } elseif ($csv | Get-member | select-object -ExpandProperty Name | ? {$_ -eq "Frequency"}) { $radio = "9800" $details = @{ $freq = $_.Frequency $tone = $_.rToneFreq $name = $_.Name } }

然后在脚本中为我正在处理的每个通道设置 tempFreq、tempTone 和 tempName,我只想使用:

$tempFreq = $details["freq"] $tempTone = $details["tone"] $tempName = $details["name"]

查找详细信息并说哦,获取“$_.Frequency”,因为这是广播 B。我想我想要做的是定义一个模式来表示此文件/广播,查看这些属性以获取您的信息和对于其他收音机,请查看这些属性以获取相同的信息。

我可能想得太多了,众所周知我会这样做。也许根据无线电类型编写几个函数并仅将所有内容返回为频率和音调会更容易,但这将使稍后查询唯一值检查变得困难。也许我应该重命名单选 B 的列标题以匹配 A,然后我就只有一个脚本了。不管怎样,我很好奇是否有办法做我想要的知识。如果没有,我肯定可以采用一些解决方法。

如果您坚持到现在,感谢您的阅读。我希望我把一切都说清楚了。

powershell variables reference
1个回答
0
投票
$details

表:

# Let's start by picking a "translation table" based on the input format
# No need for Get-Member, we can inspect the properties of the first object directly instead
if ($csv[0].psobject.Properties.Match('Receive Frequency')) {
  $columnMappings = [ordered]@{
    'freq' = 'Receive Frequency'
    'tone' = 'CTSS'
    'name' = 'Name'
  }
}
elseif ($csv[0].psobject.Properties.Match('Frequency')) {
  $columnMappings = [ordered]@{
    'freq' = 'Frequency'
    'tone' = 'rToneFreq'
    'name' = 'Name'
  }
}
else {
  Write-Warning "Unable to determine input format"
  return
}

# now let's process the input data
$freqEntries = @($csv |ForEach-Object {
  $cellValues = [ordered]@{}
  foreach ($columnHeading in $columnMappings.GetEnumerator()) {
    # use the key-value pair from the column translation table to fetch the correct property value by name
    $cellValues[$columnHeading.Key] = $_.$($columnHeading.Value)
  }

  # convert translated row entry to object and output
  [pscustomobject]$cellValues
})

$freqEntries

现在将保存具有规范化属性名称

freq
tone
name
的 CSV 条目数组:
$freqEntries |Where-Object name -like 'MANTIW*'
# or 
$($freqEntries |Get-Random) |Select freq,name

© www.soinside.com 2019 - 2024. All rights reserved.