2014-05-09 96 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將使該功能更便攜/可重複使用。

相關問題