2014-05-09 97 views
0

我在该行的文本文件中有两个计算机名 - get-content -path'c:\ powershell \ computernames.txt'。然而,只有出口一个计算机名到testADcomputers.csvExport-csv只使用文本文件中的最后一行

function Get-loginTest.ps1 { 
    #[CmdletBinding()] 
    param ( 
     $computername = (get-content -path 'c:\powershell\computernames.txt') 
    ) 

    [string]$ErrorLog = 'c:\powershell\useful\errorlog\retry.txt', 
    [switch]$LogErrors 

    foreach ($computer in $computername) 
    { 
     $os = Get-WmiObject Win32_OperatingSystem -computer $computer 
     $bios = Get-WmiObject Win32_BIOS -computer $computer 
     $model = Get-WmiObject Win32_ComputerSystem -computer $computer 
     $AD = Get-ADComputer $computer -Properties LastLogonDate 
     $ping = Test-Connection -quiet -computername $computer 
    } 

    $obj = New-Object -TypeName PSObject 
    $obj| Add-Member -MemberType NoteProperty -Name Computername -Value $computer 
    $obj| Add-Member -MemberType NoteProperty -Name OnlineStatus -value $ping  
    $obj| Add-Member -MemberType NoteProperty -Name LoggedIn -Value ($model.username) 
    $obj| Add-Member -MemberType NoteProperty -Name OSVersion -Value ($os.Caption) 
    $obj| Add-Member -MemberType NoteProperty -Name LastLogonDate -Value ($AD.LastLogonDate) 

    Write-Output $obj 
} 

Get-loginTest.ps1 | Export-Csv C:\PowerShell\TestADcomputers.csv 

回答

1

够简单,你只告诉它输出1对象。这个对象是在你的ForEach循环之后创建的,所以它只能看到循环的最后一个循环的结果。你想要做的是在你的ForEach循环中移动对象创建,并有一个包含这些对象的数组。然后,一旦您的ForEach循环完成,您可以将其输出到CSV。这个稍微修改脚本应该做你想要什么:

#[CmdletBinding()] 
param ( 
    $computername = (get-content -path 'c:\powershell\computernames.txt'), 
    [string]$ErrorLog = 'c:\powershell\useful\errorlog\retry.txt', 
    [switch]$LogErrors 
) 
[Array]$Collection = foreach ($computer in $computername){ 
    $os = Get-WmiObject Win32_OperatingSystem -computer $computer 
    $bios = Get-WmiObject Win32_BIOS -computer $computer 
    $model = Get-WmiObject Win32_ComputerSystem -computer $computer 
    $AD = Get-ADComputer $computer -Properties LastLogonDate 
    $ping = Test-Connection -quiet -computername $computer 

    New-Object -TypeName PSObject -Property @{ 
     Computername = $computer 
     OnlineStatus = $ping  
     LoggedIn = $model.username 
     OSVersion = $os.Caption 
     LastLogonDate = $AD.LastLogonDate 
    } 
} 
$Collection | Export-Csv TestADComputers.csv -NoTypeInformation 
+0

谢谢!这使我的文本文件中的所有电脑。 – MattMoo

0
function Get-loginTest { 
#[CmdletBinding()] 
param ( 
    $computername = (get-content -path 'c:\powershell\computernames.txt') 
) 

[string]$ErrorLog = 'c:\powershell\useful\errorlog\retry.txt', 
[switch]$LogErrors 
$objs = @() 
foreach ($computer in $computername) 
{ 
    $os = Get-WmiObject Win32_OperatingSystem -computer $computer 
    $bios = Get-WmiObject Win32_BIOS -computer $computer 
    $model = Get-WmiObject Win32_ComputerSystem -computer $computer 
    $AD = Get-ADComputer $computer -Properties LastLogonDate 
    $ping = Test-Connection -quiet -computername $computer 

    $obj = New-Object -TypeName PSObject 
    $obj| Add-Member -MemberType NoteProperty -Name Computername -Value $computer 
    $obj| Add-Member -MemberType NoteProperty -Name OnlineStatus -value $ping  
    $obj| Add-Member -MemberType NoteProperty -Name LoggedIn -Value ($model.username) 
    $obj| Add-Member -MemberType NoteProperty -Name OSVersion -Value ($os.Caption) 
    $obj| Add-Member -MemberType NoteProperty -Name LastLogonDate -Value ($AD.LastLogonDate) 
    $objs += $obj 
} 

Write-Output $objs 
} 

Get-loginTest | Export-Csv C:\PowerShell\TestADcomputers.csv -NoTypeInformation 

创建一个数组要存储在每个自定义对象中,每个自定义对象添加到阵列中的for循环

1

其他的答案已经注意到foreach循环没有完全包围所有必要的代码。另一种选择是取消函数中的循环并允许函数处理流水线输入。这将使您更灵活地使用该功能。

function Get-loginTest { 
    [CmdLetBinding()] 
    param (
     [Parameter(ValueFromPipeline=$True)] 
     $computer = 'localhost' 
    ) 

    process { 
     $os = Get-WmiObject Win32_OperatingSystem -computer $computer 
     $bios = Get-WmiObject Win32_BIOS -computer $computer 
     $model = Get-WmiObject Win32_ComputerSystem -computer $computer 
     $AD = Get-ADComputer $computer -Properties LastLogonDate 
     $ping = Test-Connection -quiet -computername $computer 

     $obj = New-Object -TypeName PSObject 
     $obj| Add-Member -MemberType NoteProperty -Name Computername -Value $computer 
     $obj| Add-Member -MemberType NoteProperty -Name OnlineStatus -value $ping  
     $obj| Add-Member -MemberType NoteProperty -Name LoggedIn -Value ($model.username) 
     $obj| Add-Member -MemberType NoteProperty -Name OSVersion -Value ($os.Caption) 
     $obj| Add-Member -MemberType NoteProperty -Name LastLogonDate -Value ($AD.LastLogonDate) 

     $obj 
    } 
} 

这将让你管从Get-Content计算机:

get-content -path 'c:\powershell\computernames.txt'| 
    Get-loginTest| 
    Export-Csv C:\temp\TestADcomputers.csv 

或者你也可以为函数指定单台计算机。

Get-loginTest workstation1| 
    Export-Csv C:\temp\TestADcomputers.csv 

请注意,我也去掉了Get-Content调用作为计算机名称的默认值。依靠外部数据源通常不是默认值的好主意。改为使用localhost将使该功能更便携/可重复使用。

相关问题