Powershell脚本中的多个命令和Export

时间:2017-10-24 21:48:00

标签: powershell powershell-remoting

我一直试图解决这个问题很长一段时间。我的最终目标是将导出的报告作为单个csv表。但是,我一直非常不成功。然后我将其分解为导出2张我可以合并的页面,然而,CIM根本就没有打好。然后我的另一个问题是没有正确地从我的列表中调用。

$ComputerList = "C:\ps_test\pclastlogon.txt"
$LogPath = "C:\ps_test\Logs"
$LogTime = Get-Date -Format s | foreach {$_ -replace ":", "-"}
$CsvLogonPath = $LogPath+'\RebootStatus-'+$LogTime+'-Logon.csv'
$CsvBootPath = $LogPath+'\RebootStatus-'+$LogTime+'-LastBoot.csv'

Import-Module ActiveDirectory

IF ( -Not (Test-Path -Path $LogPath)) {New-Item -Path $LogPath -ItemType Directory}

$Computers = Get-Content $ComputerList

Foreach ($Computers in $ComputerList) {
Get-ADComputer -Identity $Computers -Properties * -Filter * | Select-Object cn,LastLogonDate,@{LABEL="Last Logon";EXPRESSION={[DateTime]::FromFileTime($_.LastLogon)}} | Export-Csv -Path $CsvLogonPath
}

Foreach ($Computers in $ComputerList) {
Get-CimInstance Win32_OperatingSystem -ComputerName $Computers | Select csname,LastBootUpTime | Export-Csv -Path $CsvBootPath
}

有人可以指出我正确的方向吗?提前谢谢。

3 个答案:

答案 0 :(得分:1)

  1. 不使用-filter * -Properties *,它太贵了。在-Properties中提及所需的属性,如果您提到-Identity,则不一定需要-filter *

  2. Get-ADComputerGet-CimInstance换成一个foreach并创建一个CustomObject,然后导出为CSV。

  3. [未经测试] 例如:

    $AllDetails = Foreach ($Computers in $ComputerList) {
              $DetailsfromAD = Get-ADComputer -Identity $Computers -Properties cn,LastLogonDate,LastLogon | Select-Object cn,LastLogonDate,@{LABEL="Last Logon";EXPRESSION={[DateTime]::FromFileTime($_.LastLogon)}}
              $DetailsFromCIM = Get-CimInstance Win32_OperatingSystem -ComputerName $Computers | Select csname,LastBootUpTime 
    
              $PropertyHash = @{
                               CN               = $DetailsfromAD.CN
                               LastLogonDate    = $DetailsfromAD.LastLogonDate
                              'Last Logon'      = $DetailsfromAD.'Last Logon'
                               csname           = $DetailsFromCIM.csname
                               LastBootUpTime  = $DetailsFromCIM.LastBootUpTime
               }
               New-Object -TypeName PSObject -Property $PropertyHash
    }
    

    $AllDetails导出为CSV文件

答案 1 :(得分:0)

这里只是一个猜测,但在管道之后,我认为你需要为每个你的命令列表。像

这样的东西
Get-ADComputer -Identity $Computers -Properties * -Filter * | % { Select-Object cn,LastLogonDate,@{LABEL="Last Logon";EXPRESSION={[DateTime]::FromFileTime($_.LastLogon)}} | Export-Csv -Path $CsvLogonPath }

但是你需要做一些事情来追加每个结果,而不是仅仅在$CSvLogonPath

中添加最后一个结果

答案 2 :(得分:0)

连接由单个源列表产生的两个对象列表的一般方法:

使用$Computers在两个对象列表中将原始计算机列表($ComputerList)中的计算机名称(@{Label="ComputerName"; Expression={$Computers}})添加为主键:

$ADComputers = Foreach ($Computers in $ComputerList) {
    Get-ADComputer -Identity $Computers -Properties * -Filter * | Select-Object @{Label="ComputerName"; Expression={$Computers}},cn,LastLogonDate,@{LABEL="Last Logon";EXPRESSION={[DateTime]::FromFileTime($_.LastLogon)}}
}

$CimInstances = Foreach ($Computers in $ComputerList) {
    Get-CimInstance Win32_OperatingSystem -ComputerName $Computers | Select @{Label="ComputerName"; Expression={$Computers}},csname,LastBootUpTime
}

使用Join-Object功能加入ComputerName上的对象列表:

$ADComputers | Join $CimInstances -On ComputerName | Export-Csv -Path $CsvBootPath

您可能会考虑轻松做到这一点而忘记主键,只需根据其索引加入两个表:

$ADComputers | Join $CimInstances -Using {$LeftIndex -eq $RightIndex}

但我建议不要这样做,因为如果你的某个表缺少一条记录(例如因为它不存在数据库),索引可能会错误对齐。