簡體   English   中英

如何在PowerShell中將數據導出到CSV?

[英]How to export data to CSV in PowerShell?

foreach ($computer in $computerlist) {
    if((Test-Connection -Cn $computer -BufferSize 16 -Count 1 -ea 0 -quiet))
    {
        foreach ($file in $REMOVE) {
            Remove-Item "\\$computer\$DESTINATION\$file" -Recurse
            Copy-Item E:\Code\powershell\shortcuts\* "\\$computer\$DESTINATION\"            
        }
    } else {
        Write-Host "\\$computer\$DESTINATION\"
    }
}

我想將Write-Host“\\ $ computer \\ $ DESTINATION \\”導出到CSV文件,以便我知道腳本運行時哪些計算機處於脫機狀態。

我是從Windows 7機器上運行的

此解決方案創建一個psobject並將每個對象添加到一個數組中,然后通過Export-CSV管理數組的內容來創建csv。

$results = @()
foreach ($computer in $computerlist) {
    if((Test-Connection -Cn $computer -BufferSize 16 -Count 1 -ea 0 -quiet))
    {
        foreach ($file in $REMOVE) {
            Remove-Item "\\$computer\$DESTINATION\$file" -Recurse
            Copy-Item E:\Code\powershell\shortcuts\* "\\$computer\$DESTINATION\"            
        }
    } else {

        $details = @{            
                Date             = get-date              
                ComputerName     = $Computer                 
                Destination      = $Destination 
        }                           
        $results += New-Object PSObject -Property $details  
    }
}
$results | export-csv -Path c:\temp\so.csv -NoTypeInformation

如果將字符串對象傳遞給csv,則會將其長度寫入csv,這是因為這些是字符串的屬性,有關詳細信息,請參閱此處

這就是我首先創建一個新對象的原因。

請嘗試以下方法:

write-output "test" | convertto-csv -NoTypeInformation

這會給你:

"Length"
"4"

如果在寫輸出上使用Get-Member,如下所示:

write-output "test" | Get-Member -MemberType Property

你會看到它有一個屬性 - 'length':

   TypeName: System.String

Name   MemberType Definition
----   ---------- ----------
Length Property   System.Int32 Length {get;}

這就是為什么將長度寫入csv文件。


更新:附加CSV如果文件變大,則不是最有效的方法...

$csvFileName = "c:\temp\so.csv"
$results = @()
if (Test-Path $csvFileName)
{
    $results += Import-Csv -Path $csvFileName
}
foreach ($computer in $computerlist) {
    if((Test-Connection -Cn $computer -BufferSize 16 -Count 1 -ea 0 -quiet))
    {
        foreach ($file in $REMOVE) {
            Remove-Item "\\$computer\$DESTINATION\$file" -Recurse
            Copy-Item E:\Code\powershell\shortcuts\* "\\$computer\$DESTINATION\"            
        }
    } else {

        $details = @{            
                Date             = get-date              
                ComputerName     = $Computer                 
                Destination      = $Destination 
        }                           
        $results += New-Object PSObject -Property $details  
    }
}
$results | export-csv -Path $csvFileName -NoTypeInformation

只需使用Out-File cmd,但不要忘記給出一種編碼類型: -Encoding UTF8

所以使用它:

$log | Out-File -Append C:\as\whatever.csv -Encoding UTF8

如果你想多次寫入文件,則需要-Append。

您要搜索的是Export-Csv file.csv

嘗試使用Get-Help Export-Csv來查看可能的內容

Out-File -FilePath "file.csv"也可以

你可以隨時使用

echo "Column1`tColumn2`tColumn3..." >> results.csv

您需要在列之間放置“t”以將變量分隔到它們自己的列中。 這是我編寫腳本的方式:

echo "Host`tState" >> results.csv
$names = Get-Content "hostlist.txt"
foreach ($name in $names) {
    $count = 0
    $count2 = 13490

    if ( Test-Connection -ComputerName $name -Count 1 -ErrorAction SilentlyContinue ) {
        echo "$name`tUp" >> results.csv
    }
    else {
        echo "$name`tDown" >> results.csv
    }

    $count++
    Write-Progress -Activity "Gathering Information" -status "Pinging Hosts..." -percentComplete ($count / $count2 *100)

}

這對我來說是最簡單的方法。 我得到的輸出是:

Host|State
----------
H1  |Up
H2  |UP
H3  |Down

你可以玩看看,但這是基本的想法。 $ count只是一個進度條,如果你想增加外觀

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM