powershell - 如何将复杂的 Powershell 数组序列化到磁盘以供第二个脚本处理?

标签 powershell serialization exchange-server exchange-server-2010

我正在收集有关 Exchange 环境的统计信息,并且需要收集有关所有正在使用的 DNS 域的统计信息。

这是一个漫长而密集的操作,可能需要很长时间。我想将这些值保存到磁盘上,这样我就可以在摘要上运行一个后处理器。

我应该如何更改我在下面编写的脚本以便运行后处理器?

$dict = @{}
$AcceptedDomains = Get-AcceptedDomain | select domainname
foreach($ad in $AcceptedDomains)
{
   $tmp = $dict[$ad.DomainName]
   if ($tmp -eq $null)
   {
       $obj1 = @{CountPrimary = 0; CountWindows =0; CountSecondary = 0; IsAcceptedDomain = 0; DNS_MX = ""; DNS_SRV= ""; SSL=""}
       $dict.Add($ad.DomainName.ToString(), $obj1)
   } 

   $dict[$ad.DomainName.ToString()].IsAcceptedDomain = 1
}



foreach($currentmb in get-mailbox -resultsize unlimited|select PrimarySMTPAddress, WindowsEmailAddress, EmailAddresses)
{
   $domName = $currentmb.PrimarySmtpAddress.ToString().Split("@")[1].ToString();
   $tmp = $dict[ $domName]
   if ($tmp -eq $null)
   {
       $obj1 = @{CountPrimary = 0; CountWindows =0; CountSecondary = 0; IsAcceptedDomain = 0; DNS_MX = ""; DNS_SRV= ""; SSL=""}
       $dict.Add( $domName, $obj1)
   } 
   $dict[$domName].CountPrimary+= 1



   $domName = $currentmb.WindowsEmailAddress.ToString().Split("@")[1].ToString();
   $tmp = $dict[ $domName]
   if ($tmp -eq $null)
   {
       $obj1 = @{CountPrimary = 0; CountWindows =0; CountSecondary = 0; IsAcceptedDomain = 0; DNS_MX = ""; DNS_SRV= ""; SSL=""}
       $dict.Add( $domName, $obj1)
   } 
   $dict[$domName].CountWindows += 1



   $secondaries = New-Object System.Collections.ArrayList($null)
   $currentMBSmtp = $currentMB.EmailAddresses | where {$_.PrefixString -eq "SMTP"} | select SMTPAddress
   foreach($smtp1 in $currentMBSmtp)
   {
        $smtp1Domain =     $smtp1.SmtpAddress.ToString().Split("@")[1].ToString()
        $secondaries.Add($smtp1Domain) 
   }
   foreach($domName1 in $secondaries | select -unique)
   {
    $tmp = $dict[ $domName1]
    if ($tmp -eq $null)
    {
            $obj1 = @{CountPrimary = 0; CountWindows =0; CountSecondary = 0; IsAcceptedDomain = 0; DNS_MX = ""; DNS_SRV= ""; SSL=""}
            $dict.Add( $domName1, $obj1)
    } 
    $dict[$domName1].CountSecondary += 1
   }
}

如果您可以从占位符中看出,我打算查看每个 DNS 域的 MX 记录、SSL 证书和其他方面。

目的是获得有关正在使用的域的足够信息,以便可以根据需要对每个域进行优先级排序。

数组 $dict发送到屏幕时如下所示:(为隐私而截断的域)
oup.com       {DNS_SRV, CountSecondary, CountWindows, IsAcceptedDomain, DNS_MX, SSL, CountPrimary}
isorygroup... {DNS_SRV, CountSecondary, CountWindows, IsAcceptedDomain, DNS_MX, SSL, CountPrimary}
ces.com       {DNS_SRV, CountSecondary, CountWindows, IsAcceptedDomain, DNS_MX, SSL, CountPrimary}
nc.net        {DNS_SRV, CountSecondary, CountWindows, IsAcceptedDomain, DNS_MX, SSL, CountPrimary}

单个对象如下所示:
[PS] C:\scripts>$dict["sol.com"]

Name                           Value
----                           -----
DNS_SRV
CountSecondary                 3
CountWindows                   0
IsAcceptedDomain               0
DNS_MX
SSL
CountPrimary                   0

最佳答案

您可以使用 Export-CliXml序列化并将值写入磁盘。 Import-CliXml反序列化并将其带回。

您可能需要使用 -Depth如果您的对象是嵌套的参数,我相信它默认为 2 级。增加级别会大大增加序列化所花费的时间;特别是如果您有循环引用。

如果要在内存中序列化/反序列化,可以使用[System.Management.Automation.PSSerializer]::Serialize()[System.Management.Automation.PSSerializer]::Deserialize() (这些是 cmdlet 在内部使用的,所以它是相同的表示)。

关于powershell - 如何将复杂的 Powershell 数组序列化到磁盘以供第二个脚本处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33584453/

相关文章:

function - powershell 参数需要在脚本的前面吗?

java - 使用 Powershell 时出现 JDWP 语法错误

java - 有没有办法找出Kafka序列化数据所花费的时间

Android 服务无法启动,因为来自一个甚至不再存在的类的 ClassNotFoundException

powershell - Powershell:如何获取通讯组的完整列表

Powershell 不识别 bool 参数

json - 将 TypeNameAssemblyFormat 与 PCL 一起使用时,Newtonsoft.Json 出现 MissingMethodException

delphi - 使用 EWS 创建扩展属性并从 Outlook 加载项访问它

azure - 如何通过 IMAP 访问 Outlook 电子邮件帐户

Windows Powershell 在网络适配器上设置 IP 地址