首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将复杂的Powershell数组序列化到磁盘上,以便通过第二个脚本进行处理?

如何将复杂的Powershell数组序列化到磁盘上,以便通过第二个脚本进行处理?
EN

Stack Overflow用户
提问于 2015-11-07 15:33:19
回答 1查看 3K关注 0票数 6

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

这是一项长期和密集的行动,需要很长时间。我想将这些值持久化到磁盘,这样我就可以在摘要上运行一个后处理程序。

我应该如何修改我在下面写的脚本,以便我能够运行后处理器?

代码语言:javascript
复制
$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
   }
}

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

其目的是获取关于使用中的域的足够信息,以便根据需要对每个域进行优先排序。

发送到屏幕上的数组$dict如下所示:(域因隐私而被截断)

代码语言:javascript
复制
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}

单个对象如下所示:

代码语言:javascript
复制
[PS] C:\scripts>$dict["sol.com"]

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-07 21:59:39

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

如果您的对象是嵌套的,您可能需要使用-Depth参数,我认为它默认为2级。增加级别可以极大地增加序列化所需的时间;特别是在有循环引用的情况下。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33584453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档