Powershell 导出csv仅使用文本文件中的最后一行

Powershell 导出csv仅使用文本文件中的最后一行,powershell,csv,Powershell,Csv,我在这一行的文本文件中有两个计算机名-获取内容-路径“c:\powershell\computernames.txt”。但是,它仅将一个计算机名导出到testADcomputers.csv中 function Get-loginTest.ps1 { #[CmdletBinding()] param ( $computername = (get-content -path 'c:\powershell\computernames.txt') )

我在这一行的文本文件中有两个计算机名-获取内容-路径“c:\powershell\computernames.txt”。但是,它仅将一个计算机名导出到testADcomputers.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

很简单,您只需要告诉它输出一个对象。该对象是在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

创建一个数组来存储每个自定义对象,将每个自定义对象添加到for循环中的数组中

其他答案指出,
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-loginTest workstation1| 
    Export-Csv C:\temp\TestADcomputers.csv
这将允许您通过管道将计算机从
获取内容

get-content -path 'c:\powershell\computernames.txt'|
    Get-loginTest| 
    Export-Csv C:\temp\TestADcomputers.csv
或者,您可以为该功能指定一台计算机

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-loginTest workstation1| 
    Export-Csv C:\temp\TestADcomputers.csv

注意,我还删除了
Get Content
调用作为计算机名的默认值。对于默认值,依赖外部数据源通常不是一个好主意。改用
localhost
将使该功能更加可移植/可重用。

谢谢!这占用了我文本文件中的所有计算机。