【问题标题】:PowerShell script to export to single CSV用于导出到单个 CSV 的 PowerShell 脚本
【发布时间】:2013-10-01 12:57:04
【问题描述】:

我需要帮助才能让以下 PowerShell 脚本也只输出一个 .CSV 文件,而不是当前的两个。有人可以帮忙吗?我想要获取在远程服务器上设置的 SNMP 设置。我所追求的信息保存在注册表中。 $DellAdmKey 是一个包含子密钥的密钥,它指的是“communityNames”。在每个子键中,我得到引用“TrapDestinations”的“值数据”。 $DellAdmKey2 是一个名为“ValidCommunities”的键,但没有子键,它只有引用“AcceptedCommunityNames”和“Rights”的 DWORD 值。所以第一行的foreach不能用,因为“ValidCommunities”不包含子键

$servers = "ServerName"
$BaseKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey(‘LocalMachine’, $server)
$SubKey= $BaseKey.OpenSubKey("SYSTEM\\CurrentControlSet\\Services\\SNMP\Parameters",$true)
$DellAdmKey = $BaseKey.OpenSubKey("SYSTEM\\CurrentControlSet\\Services\\SNMP\\Parameters\\TrapConfiguration\\",$true)
$DellAdmKey2 = $BaseKey.OpenSubKey("SYSTEM\\CurrentControlSet\\Services\\SNMP\\Parameters\\ValidCommunities\\",$true)

$DellAdmKey.GetSubKeyNames() | foreach {
$action = $_
$subkey = $DellAdmKey.openSubKey($_)
$subkey.GetValueNames() | foreach {$_ | Select 
@{name="ServerName";Expression={$server}},
@{Name="CommunityNames";Expression={$action}},
@{name="TrapDestinations";Expression={$subkey.getvalue($_)}}
    } | Export-Csv c:\temp\1.csv -NoTypeInformation  
}

$action = $_
$subkey = $DellAdmKey2.openSubKey($_)
$subkey.GetValueNames() | foreach {
$_ | Select @{name="ServerName";Expression={$server}},
@{name="AcceptedCommunityNames";Expression={$_}},
@{name="Rights";Expression={$subkey.getvalue($_)}}
    } | Export-Csv c:\temp\2.csv -NoTypeInformation

【问题讨论】:

标签: powershell csv output


【解决方案1】:

如果我正确理解了你的问题(和你的代码),第三组指令应该放在$DellAdmKey.GetSubKeyNames() | foreach { ... } 中。在这种情况下,您只需将| Export-Csv 移到该循环之外即可在一个 CSV 中捕获所有输出。不过,您需要确保所有对象都具有相同的属性集。

$DellAdmKey.GetSubKeyNames() | foreach {
  $action = $_
  $subkey = $DellAdmKey.openSubKey($action)
  $subkey.GetValueNames() | Select @{name="ServerName";Expression={$server}},
      @{Name="CommunityNames";Expression={$action}},
      @{name="TrapDestinations";Expression={$subkey.getvalue($_)}}
      @{name="AcceptedCommunityNames";Expression={}},
      @{name="Rights";Expression={}}

  $subkey = $DellAdmKey2.openSubKey($action)
  $subkey.GetValueNames() | Select @{name="ServerName";Expression={$server}},
      @{Name="CommunityNames";Expression={}},
      @{name="TrapDestinations";Expression={}},
      @{name="AcceptedCommunityNames";Expression={$_}},
      @{name="Rights";Expression={$subkey.getvalue($_)}}
} | Export-Csv 'c:\temp\out.csv' -NoTypeInformation

编辑:如果您真的只想运行您发布的代码(这对我来说似乎有些可疑,因为第 17 行中的 $_ 应该是空的),您可以更改第二个 @ 987654325@指令到

... | Export-Csv 'c:\temp\1.csv' -Append -NoTypeInformation

前提是您运行的是 PowerShell v3。在此之前应该这样做:

... | ConvertTo-Csv -NoTypeInformation | select -Skip 1 |
  Out-File 'c:\temp\1.csv' -Append

不过,无论哪种方式,您都应该确保要导出的所有对象都具有相同的属性集。否则,您最终可能会在 TrapDestination 列中得到 Rights 值或类似的值。

【讨论】:

  • 感谢您的回复,这不是问题所在,因为 $DellAdmKey2 不像 $DellAdmKey 那样驻留在子密钥下。它们是“ValidCommunities”的“DWORD”,我需要值名称和值数据。我发布的脚本正确地输出到每个 CSV ok。但需要结合它,但这就是我卡住的地方。
  • 看来我的方法是错误的?让我解释一下我所追求的,看看是否有更好的方法。 $DellAnmKey 有子密钥
  • 让我解释一下我所追求的,看看是否有更好的方法。我想要获取在删除服务器上设置的 SNMP 设置。我所追求的信息保存在注册表中。 $DellAdmKey 是一个包含称为“communityNames”的子键的键,在每个子键中我得到称为“TrapDestination”的“值数据”。 $DellAdmKey2 是一个名为“ValidCommunities”的键,但没有子键,它只有称为“AcceptedCommunityNames”和“Rights”的 DWORD 值。所以第一行的foreach不能用,因为“ValidCommunities”不包含子键。
  • @user1890242 在这种情况下,将第二个 $subkey.GetValueNames() 替换为 $DellAdmKey2.GetValueNames() 并删除它之前的 2 行。
  • “不好”是一个不充分的问题描述。使用您当前使用的代码、创建的输出示例以及该输出的外观示例更新您的问题。
【解决方案2】:

我使用了这个http://psrr.codeplex.com/,它让生活更轻松。感谢 Ansgar 的回复。

【讨论】:

    猜你喜欢
    • 2021-01-04
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    相关资源
    最近更新 更多