Powershell变量导出CSV缓存?

时间:2014-08-13 03:37:43

标签: powershell powershell-v2.0 export-to-csv

我正在制作Richard L. Mueller(http://www.rlmueller.net/PowerShell/PSLastLogon.txt

的剧本
Trap {"Error: $_"; Break;}

$D = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$Domain = [ADSI]"LDAP://$D"
$Searcher = New-Object System.DirectoryServices.DirectorySearcher
$Searcher.PageSize = 200
$Searcher.SearchScope = "subtree"

$Searcher.Filter = "(&(objectCategory=person)(objectClass=user))"
$Searcher.PropertiesToLoad.Add("samAccountName") > $Null
$Searcher.PropertiesToLoad.Add("lastLogon") > $Null

$arrUsers = @{}


ForEach ($DC In $D.DomainControllers)
{
$Server = $DC.Name
$Searcher.SearchRoot = "LDAP://$Server/" + $Domain.distinguishedName
$Results = $Searcher.FindAll()
ForEach ($Result In $Results)
{
    $DN = $Result.Properties.Item("samAccountName")
    $LL = $Result.Properties.Item("lastLogon")
    If ($LL.Count -eq 0)
    {
        $Last = [DateTime]0
    }
    Else
    {
        $Last = [DateTime]$LL.Item(0)
    }
    If ($Last -eq 0)
    {
        $LastLogon = $Last.AddYears(1600)
    }
    Else
    {
        $LastLogon = $Last.AddYears(1600).ToLocalTime()
    }
    If ($arrUsers.ContainsKey("$DN"))
    {
        If ($LastLogon -gt $arrUsers["$DN"])
        {
            $arrUsers["$DN"] = $LastLogon
        }
    }
    Else
    {
        $arrUsers.Add("$DN", $LastLogon)
    }
}
}


$inactiveusers = @()
$Users = $arrUsers.Keys
ForEach ($DN In $Users)
{
$Date = $arrUsers["$DN"]
"$DN;$Date"
$inactiveusers += $DN
$inactiveusers += $Date
$inactiveusers | export-csv "c:\test.csv"
}

考虑将信息存储到另一个数组,我将这些行添加为$ inactiveusers(总共4行)。但是,导出的CSV不会给我正确的结果,而不是列出用户samAccountName& lastlogon,返回samAccountName的长度。

除此之外,从那以后我无法在我的另一个脚本中导出相同的变量,即使脚本只是简单如下:

$inactiveusers = "Test"
$inactiveusers | Export-Csv c:\test.csv
write-host $inactiveusers

导出的CSV仍然给我字符串的长度"测试",但是写主机结果是正确的。 我试过remove-variable,logoff&登录回来,但都没有运气。 我不确定缓存存储在哪里。我可以稍后处理该脚本,但首先我希望能够在另一个脚本中将此变量导出为CSV。很感激任何人都可以给我一些提示

2 个答案:

答案 0 :(得分:0)

为什么要将所有项目从$arrUsers移至$inactiveusers?您可以通过在最后添加它来获得所需的结果:

$arrUsers.getEnumerator() | Select-Object Key,Value | 
   Export-Csv c:\test.csv  -NoTypeInformation

详细了解Export-CSVhttp://technet.microsoft.com/en-us/library/hh849932.aspx

答案 1 :(得分:0)

Export-Csv cmdlet不导出字符串。它将对象的属性导出为输出CSV文件的字段。对于字符串对象,导出的属性是字符串的长度。您需要将哈希表转换为自定义对象列表,以使导出按预期工作:

$arrUsers.Keys | % {
  New-Object -Type PSObject -Property @{
    'sAMAccountName' = $_
    'lastLogon'      = $arrUsers[$_]
  }
} | Export-Csv 'C:\test.csv' -NoType

此外,手动日期计算可以用FromFileTime()方法替换:

$lastLogon = [DateTime]::FromFileTime($Result.Properties.Item("lastLogon"))

话虽如此,你为什么要“手工”这样做呢? ActiveDirectory PowerShell模块有一个cmdlet Get-ADUser,它已经为您完成了所有工作:

Import-Module ActiveDirectory

Get-ADUser -Filter * -Properties * | ? {
  $_.LastLogonDate -lt (Get-Date).AddDays(-60)
} | select SamAccountName, LastLogonDate | Export-Csv 'C:\test.csv' -NoType