Share via


Export-Csv

將 物件轉換成一系列的逗號分隔值, (CSV) 字串,並將字串儲存至檔案。

Syntax

Export-Csv
      -InputObject <PSObject>
      [[-Path] <String>]
      [-LiteralPath <String>]
      [-Force]
      [-NoClobber]
      [-Encoding <Encoding>]
      [-Append]
      [[-Delimiter] <Char>]
      [-IncludeTypeInformation]
      [-NoTypeInformation]
      [-WhatIf]
      [-Confirm]
      [<CommonParameters>]
Export-Csv
      -InputObject <PSObject>
      [[-Path] <String>]
      [-LiteralPath <String>]
      [-Force]
      [-NoClobber]
      [-Encoding <Encoding>]
      [-Append]
      [-UseCulture]
      [-IncludeTypeInformation]
      [-NoTypeInformation]
      [-WhatIf]
      [-Confirm]
      [<CommonParameters>]

Description

Cmdlet Export-CSV 會建立您所提交物件的 CSV 檔案。 每個物件都是一個數據列,其中包含物件屬性值的逗號分隔清單。 您可以使用 Export-CSV Cmdlet 來建立電子錶格,並與接受 CSV 檔案作為輸入的程式共享數據。

不要在將對象傳送至 Export-CSV Cmdlet 之前格式化物件。 如果 Export-CSV 收到格式化的物件,則 CSV 檔案會包含格式屬性,而不是物件屬性。 若要只匯出對象的選取屬性,請使用 Select-Object Cmdlet。

範例

範例 1:將進程屬性匯出至 CSV 檔案

本範例會選取 [ 處理 具有特定屬性的物件],將對象匯出至 CSV 檔案。

Get-Process -Name WmiPrvSE | Select-Object -Property BasePriority,Id,SessionId,WorkingSet |
  Export-Csv -Path .\WmiData.csv -NoTypeInformation
Import-Csv -Path .\WmiData.csv

BasePriority Id    SessionId WorkingSet
------------ --    --------- ----------
8            976   0         20267008
8            2292  0         36786176
8            3816  0         30351360
8            8604  0         15011840
8            10008 0         8830976
8            11764 0         14237696
8            54632 0         9502720

Cmdlet Get-Process 會取得 Process 物件。 Name 參數會篩選輸出,只包含 WmiPrvSE 進程物件。 進程物件會從管線向下傳送至 Select-Object Cmdlet。 Select-Object 會使用 Property 參數來選取進程物件屬性的子集。 進程物件會從管線向下傳送至 Export-Csv Cmdlet。 Export-Csv 將進程物件轉換成一系列的 CSV 字串。 Path 參數會指定 WmiData.csv 檔案儲存在目前目錄中。 NoTypeInformation 參數會從 CSV 輸出中移除 #TYPE 資訊標頭,而且 PowerShell 6 中不需要。 Cmdlet Import-Csv 會使用 Path 參數來顯示位於目前目錄中的檔案。

範例 2:將進程匯出至逗號分隔檔案

這個範例會取得 Process 物件,並將對象匯出至 CSV 檔案。

Get-Process | Export-Csv -Path .\Processes.csv -NoTypeInformation
Get-Content -Path .\Processes.csv

"Name","SI","Handles","VM","WS","PM","NPM","Path","Parent","Company","CPU","FileVersion", ...
"ApplicationFrameHost","4","511","2203597099008","35364864","21979136","30048", ...

Cmdlet Get-Process 會取得 Process 物件。 進程物件會從管線向下傳送至 Export-Csv Cmdlet。 Export-Csv 將進程物件轉換成一系列的 CSV 字串。 Path 參數會指定 Processes.csv 檔案儲存在目前目錄中。 NoTypeInformation 參數會從 CSV 輸出中移除 #TYPE 資訊標頭,而且 PowerShell 6 中不需要。 Cmdlet Get-Content 會使用 Path 參數來顯示位於目前目錄中的檔案。

範例 3:將進程匯出至以分號分隔的檔案

這個範例會取得 Process 物件,並將對象匯出至具有分號分隔符的檔案。

Get-Process | Export-Csv -Path .\Processes.csv -Delimiter ';' -NoTypeInformation
Get-Content -Path .\Processes.csv

"Name";"SI";"Handles";"VM";"WS";"PM";"NPM";"Path";"Parent";"Company";"CPU";"FileVersion"; ...
"ApplicationFrameHost";"4";"509";"2203595321344";"34807808";"21770240";"29504"; ...

Cmdlet Get-Process 會取得 Process 物件。 進程物件會從管線向下傳送至 Export-Csv Cmdlet。 Export-Csv 將進程物件轉換成一系列的 CSV 字串。 Path 參數會指定 Processes.csv 檔案儲存在目前目錄中。 分隔符參數會指定要分隔字串值的分號。 NoTypeInformation 參數會從 CSV 輸出中移除 #TYPE 資訊標頭,而且 PowerShell 6 中不需要。 Cmdlet Get-Content 會使用 Path 參數來顯示位於目前目錄中的檔案。

範例 4:使用目前文化特性的清單分隔符匯出進程

這個範例會取得 Process 物件,並將 對象匯出至檔案。 分隔符是目前文化特性的清單分隔符。

(Get-Culture).TextInfo.ListSeparator
Get-Process | Export-Csv -Path .\Processes.csv -UseCulture -NoTypeInformation
Get-Content -Path .\Processes.csv

"Name","SI","Handles","VM","WS","PM","NPM","Path","Parent","Company","CPU","FileVersion", ...
"ApplicationFrameHost","4","511","2203597099008","35364864","21979136","30048", ...

Cmdlet Get-Culture 會使用巢狀屬性 TextInfoListSeparator ,並顯示目前文化特性的預設清單分隔符。 Cmdlet Get-Process 會取得 Process 物件。 進程物件會從管線向下傳送至 Export-Csv Cmdlet。 Export-Csv 將進程物件轉換成一系列的 CSV 字串。 Path 參數會指定 Processes.csv 檔案儲存在目前目錄中。 UseCulture 參數會使用目前文化特性的預設清單分隔符作為分隔符。 NoTypeInformation 參數會從 CSV 輸出中移除 #TYPE 資訊標頭,而且 PowerShell 6 中不需要。 Cmdlet Get-Content 會使用 Path 參數來顯示位於目前目錄中的檔案。

範例 5:導出具有類型資訊的處理程式

此範例說明如何在 CSV 檔案中包含 #TYPE 標頭資訊。 #TYPE 標頭是 PowerShell 6.0 之前的版本預設值。

Get-Process | Export-Csv -Path .\Processes.csv -IncludeTypeInformation
Get-Content -Path .\Processes.csv

#TYPE System.Diagnostics.Process
"Name","SI","Handles","VM","WS","PM","NPM","Path","Company","CPU","FileVersion", ...
"ApplicationFrameHost","4","507","2203595001856","35139584","20934656","29504", ...

Cmdlet Get-Process 會取得 Process 物件。 進程物件會從管線向下傳送至 Export-Csv Cmdlet。 Export-Csv 將進程物件轉換成一系列的 CSV 字串。 Path 參數會指定 Processes.csv 檔案儲存在目前目錄中。 IncludeTypeInformation 包含 CSV 輸出中 #TYPE 資訊標頭。 Cmdlet Get-Content 會使用 Path 參數來顯示位於目前目錄中的檔案。

範例 6:將物件匯出並附加至 CSV 檔案

此範例描述如何將對象匯出至 CSV 檔案,並使用 Append 參數將物件新增至現有的檔案。

$AppService = (Get-Service -DisplayName *Application* | Select-Object -Property DisplayName, Status)
$AppService | Export-Csv -Path .\Services.Csv -NoTypeInformation
Get-Content -Path .\Services.Csv
$WinService = (Get-Service -DisplayName *Windows* | Select-Object -Property DisplayName, Status)
$WinService | Export-Csv -Path ./Services.csv -NoTypeInformation -Append
Get-Content -Path .\Services.Csv

"DisplayName","Status"
"Application Layer Gateway Service","Stopped"
"Application Identity","Running"
"Windows Audio Endpoint Builder","Running"
"Windows Audio","Running"
"Windows Event Log","Running"

Cmdlet Get-Service 會取得服務物件。 DisplayName 參數會傳回包含Application 一字的服務。 服務物件會從管線向下傳送至 Select-Object Cmdlet。 Select-Object 會使用 Property 參數來指定 DisplayNameStatus 屬性。 變數 $AppService 會儲存物件。

物件 $AppService 會從管線向下傳送至 Export-Csv Cmdlet。 Export-Csv 將服務物件轉換成一系列 CSV 字串。 Path 參數會指定 Services.csv 檔案儲存在目前目錄中。 NoTypeInformation 參數會從 CSV 輸出中移除 #TYPE 資訊標頭,而且 PowerShell 6 中不需要。 Cmdlet Get-Content 會使用 Path 參數來顯示位於目前目錄中的檔案。

Get-ServiceSelect-Object Cmdlet 會針對包含 Windows 一詞的服務重複執行。 變數 $WinService 會儲存服務物件。 Cmdlet Export-Csv 會使用 Append 參數來 $WinService 指定物件已新增至現有的 Services.csv 檔案。 Cmdlet Get-Content 會重複顯示包含附加數據的更新檔案。

範例 7:在管線內格式化 Cmdlet 會建立非預期的結果

此範例顯示為何請務必不要在管線中使用格式 Cmdlet。 收到非預期的輸出時,請針對管線語法進行疑難解答。

Get-Date | Select-Object -Property DateTime, Day, DayOfWeek, DayOfYear |
 Export-Csv -Path .\DateTime.csv -NoTypeInformation
Get-Content -Path .\DateTime.csv

"DateTime","Day","DayOfWeek","DayOfYear"
"Wednesday, January 2, 2019 14:59:34","2","Wednesday","2"

Get-Date | Format-Table -Property DateTime, Day, DayOfWeek, DayOfYear |
 Export-Csv -Path .\FTDateTime.csv -NoTypeInformation
Get-Content -Path .\FTDateTime.csv

"ClassId2e4f51ef21dd47e99d3c952918aff9cd","pageHeaderEntry","pageFooterEntry","autosizeInfo", ...
"033ecb2bc07a4d43b5ef94ed5a35d280",,,,"Microsoft.PowerShell.Commands.Internal.Format. ...
"9e210fe47d09416682b841769c78b8a3",,,,,
"27c87ef9bbda4f709f6b4002fa4af63c",,,,,
"4ec4f0187cb04f4cb6973460dfe252df",,,,,
"cf522b78d86c486691226b40aa69e95c",,,,,

Cmdlet Get-Date 會取得 DateTime 物件。 物件會從管線向下傳送至 Select-Object Cmdlet。 Select-Object 會使用 Property 參數來選取物件屬性的子集。 物件會從管線向下傳送至 Export-Csv Cmdlet。 Export-Csv 將物件轉換成 CSV 格式。 Path 參數會指定 DateTime.csv 檔案儲存在目前目錄中。 NoTypeInformation 參數會從 CSV 輸出中移除 #TYPE 資訊標頭,而且 PowerShell 6 中不需要。 Cmdlet Get-Content 會使用 Path 參數來顯示位於目前目錄中的 CSV 檔案。

當管 Format-Table 線內使用 Cmdlet 來選取收到非預期結果的屬性時。 Format-Table 將數據表格式物件向下傳送至 Cmdlet, Export-Csv 而不是 DateTime 物件。 Export-Csv 將數據表格式物件轉換成一系列 CSV 字串。 Cmdlet Get-Content 會顯示包含資料表格式物件的 CSV 檔案。

範例 8:使用 Force 參數覆寫唯讀檔案

此範例會建立空的唯讀檔案,並使用 Force 參數來更新檔案。

New-Item -Path .\ReadOnly.csv -ItemType File
Set-ItemProperty -Path .\ReadOnly.csv -Name IsReadOnly -Value $true
Get-Process | Export-Csv -Path .\ReadOnly.csv -NoTypeInformation

Export-Csv : Access to the path 'C:\ReadOnly.csv' is denied.
At line:1 char:15
+ Get-Process | Export-Csv -Path .\ReadOnly.csv -NoTypeInformation
+               ~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : OpenError: (:) [Export-Csv], UnauthorizedAccessException
+ FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.ExportCsvCommand

Get-Process | Export-Csv -Path .\ReadOnly.csv -NoTypeInformation -Force
Get-Content -Path .\ReadOnly.csv

"Name";"SI";"Handles";"VM";"WS";"PM";"NPM";"Path";"Parent";"Company";"CPU";"FileVersion"; ...
"ApplicationFrameHost";"4";"509";"2203595321344";"34807808";"21770240";"29504"; ...

Cmdlet New-Item 會使用 PathItemType 參數,在目前目錄中建立 ReadOnly.csv 檔案。 Cmdlet Set-ItemProperty 會使用 NameValue 參數,將檔案的 IsReadOnly 屬性變更為 true。 Cmdlet Get-Process 會取得 Process 物件。 進程物件會從管線向下傳送至 Export-Csv Cmdlet。 Export-Csv 將進程物件轉換成一系列的 CSV 字串。 Path 參數會指定 ReadOnly.csv 檔案儲存在目前目錄中。 NoTypeInformation 參數會從 CSV 輸出中移除 #TYPE 資訊標頭,而且 PowerShell 6 中不需要。 輸出會顯示檔案未寫入,因為存取遭到拒絕。

Force 參數會新增至 Export-Csv Cmdlet,以強制匯出寫入檔案。 Cmdlet Get-Content 會使用 Path 參數來顯示位於目前目錄中的檔案。

範例 9:搭配 Append 使用 Force 參數

此範例示範如何使用 ForceAppend 參數。 結合這些參數時,可以將不相符的物件屬性寫入 CSV 檔案。

$Content = [PSCustomObject]@{Name = 'PowerShell Core'; Version = '6.0'}
$Content | Export-Csv -Path .\ParmFile.csv -NoTypeInformation
$AdditionalContent = [PSCustomObject]@{Name = 'Windows PowerShell'; Edition = 'Desktop'}
$AdditionalContent | Export-Csv -Path .\ParmFile.csv -NoTypeInformation -Append

Export-Csv : Cannot append CSV content to the following file: ParmFile.csv.
The appended object does not have a property that corresponds to the following column:
Version. To continue with mismatched properties, add the -Force parameter, and then retry
 the command.
At line:1 char:22
+ $AdditionalContent | Export-Csv -Path .\ParmFile.csv -NoTypeInformation -Append
+                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidData: (Version:String) [Export-Csv], InvalidOperationException
+ FullyQualifiedErrorId : CannotAppendCsvWithMismatchedPropertyNames,Microsoft.PowerShell. ...

$AdditionalContent | Export-Csv -Path .\ParmFile.csv -NoTypeInformation -Append -Force
Import-Csv -Path .\ParmFile.csv

Name               Version
----               -------
PowerShell Core    6.0
Windows PowerShell

表達式會建立具有 NameVersion 屬性的 PSCustomObject。 這些值會儲存在變數中 $Content 。 變數 $Content 會向下傳送至 Export-Csv Cmdlet。 Export-Csv 會使用 Path 參數,並將 ParmFile.csv 檔案儲存在目前的目錄中。 NoTypeInformation 參數會從 CSV 輸出中移除 #TYPE 資訊標頭,而且 PowerShell 6 中不需要。

另一個表達式會建立具有 NameEdition 屬性的 PSCustomObject。 這些值會儲存在變數中 $AdditionalContent 。 變數 $AdditionalContent 會向下傳送至 Export-Csv Cmdlet。 Append 參數可用來將數據新增至檔案。 附加失敗,因為 VersionEdition 之間有屬性名稱不符。

Cmdlet Export-CsvForce 參數可用來強制導出寫入檔案。 會捨棄 Edition 屬性。 Cmdlet Import-Csv 會使用 Path 參數來顯示位於目前目錄中的檔案。

參數

-Append

使用此參數,將 Export-CSV CSV 輸出新增至指定檔案的結尾。 如果沒有此參數, Export-CSV 請取代檔案內容,而不會發出警告。

此參數是在 Windows PowerShell 3.0 引進。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Confirm

在執行 Cmdlet 前提示您確認。

Type:SwitchParameter
Aliases:cf
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Delimiter

指定分隔符號以區隔屬性值。 預設值為逗號 (,) 。 輸入字元,例如冒號 (:) 。 若要指定分號 (;) ,請將它括在引號中。

Type:Char
Position:1
Default value:comma (,)
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Encoding

指定匯出之 CSV 檔案的編碼。 預設值是 utf8NoBOM

此參數可接受的值如下所示:

  • ascii:使用 ASCII (7 位) 字元集的編碼方式。
  • bigendianunicode:使用大位元組位元組順序以UTF-16格式編碼。
  • oem:使用 MS-DOS 和控制台程式的預設編碼方式。
  • unicode:使用小位元節順序以UTF-16格式編碼。
  • utf7:以 UTF-7 格式編碼。
  • utf8:以 UTF-8 格式編碼。
  • utf8BOM:使用位元節順序標記 (BOM) ,以 UTF-8 格式編碼
  • utf8NoBOM:以 UTF-8 格式編碼,不含位元組順序標記 (BOM)
  • utf32:以 UTF-32 格式編碼。

從 PowerShell 6.2 開始, Encoding 參數也允許已註冊代碼頁的數值標識符, (例如 -Encoding 1251) 或已註冊代碼頁的字串名稱 (,例如 -Encoding "windows-1251") 。 如需詳細資訊,請參閱 Encoding.CodePage 的 .NET 檔。

Type:Encoding
Accepted values:ASCII, BigEndianUnicode, OEM, Unicode, UTF7, UTF8, UTF8BOM, UTF8NoBOM, UTF32
Position:Named
Default value:UTF8NoBOM
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Force

此參數允許 Export-Csv 使用 唯讀 屬性覆寫檔案。

合併 ForceAppend 參數時,包含不相符屬性的物件可以寫入 CSV 檔案。 只有相符的屬性會寫入檔案。 捨棄不相符的屬性。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-IncludeTypeInformation

使用此參數時,CSV 輸出的第一行會包含 #TYPE 後面接著物件類型的完整名稱。 例如, #TYPE System.Diagnostics.Process

此參數是在 PowerShell 6.0 中引進。

Type:SwitchParameter
Aliases:ITI
Position:Named
Default value:#TYPE <Object>
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

指定要匯出為 CSV 字串的物件。 輸入包含物件的變數,或輸入可取得物件的命令或運算式。 您也可以使用管線將 物件傳送至 Export-CSV

Type:PSObject
Position:Named
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-LiteralPath

指定 CSV 輸出檔案的路徑。 與 Path 不同,LiteralPath 參數值將完全依照其輸入值來使用。 沒有字元會被視為萬用字元。 如果路徑包含逸出字元,請使用單引號。 單引號會告訴PowerShell不要將任何字元解譯為逸出序列。

Type:String
Aliases:PSPath, LP
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-NoClobber

使用此參數,這樣 Export-CSV 就不會覆寫現有的檔案。 根據預設,如果檔案存在於指定的路徑中, Export-CSV 則會覆寫檔案而不發出警告。

Type:SwitchParameter
Aliases:NoOverwrite
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-NoTypeInformation

從輸出中移除 #TYPE 資訊標頭。 此參數在 PowerShell 6.0 中變成預設值,並隨附於回溯相容性中。

Type:SwitchParameter
Aliases:NTI
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Path

必要參數,指定要儲存 CSV 輸出檔案的位置。

Type:String
Position:0
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-UseCulture

使用目前文化特性的清單分隔符做為專案分隔符。 若要尋找文化特性的清單分隔符,請使用下列命令: (Get-Culture).TextInfo.ListSeparator

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-WhatIf

防止 Cmdlet 進行處理或進行變更。 輸出會顯示執行 Cmdlet 時會發生什麼情況。

Type:SwitchParameter
Aliases:wi
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

輸入

PSObject

您可以將任何具有擴充類型系統 (ETS) 配接器的物件傳送至 Export-CSV

輸出

String

CSV 清單會傳送至 Path 參數中指定的檔案。

備註

Cmdlet 會將 Export-CSV 您提交的物件轉換成一系列 CSV 字串,並將其儲存在指定的文字檔中。 您可以使用 Export-CSV -IncludeTypeInformation 將物件儲存在 CSV 檔案中,然後使用 Import-Csv Cmdlet 從 CSV 檔案中的文字建立物件。

在 CSV 檔案中,每個物件都會利用以逗號分隔的物件屬性值清單來表示。 屬性值會使用 ToString () 方法轉換成字串。 字串是以屬性值名稱表示。 Export-CSV -IncludeTypeInformation 不會匯出物件的方法。

CSV 字串的輸出如下:

  • 如果使用 IncludeTypeInformation ,則第一個字串會包含 #TYPE 資訊標頭,後面接著物件類型的完整名稱。 例如, #TYPE System.Diagnostics.Process
  • 如果未使用 IncludeTypeInformation ,則第一個字串會包含數據行標頭。 標頭包含第一個對象的屬性名稱,做為逗號分隔清單。
  • 其餘字串包含每個物件的屬性值逗號分隔清單。

從 PowerShell 6.0 開始,的預設行為Export-CSV是不包含 CSV 和 NoTypeInformation 中的 #TYPE 資訊。 IncludeTypeInformation 可用來包含 #TYPE 資訊,並模擬 PowerShell 6.0 之前的默認行為 Export-CSV

當您將多個物件提交至 Export-CSV時, Export-CSV 會根據您提交之第一個對象的屬性來組織檔案。 如果其餘的物件不具有指定之屬性的其中之一,該物件的屬性值會是 null,以兩個連續的逗號表示。 如果其餘的物件有其他屬性,那些屬性值將不會包含在檔案中。

您可以使用 Import-Csv Cmdlet 從檔案中的 CSV 字串重新建立物件。 產生的物件是 CSV 版本的原始物件,包含屬性值的字串表示,而且不含方法。

ConvertFrom-Csv Cmdlet 會將ConvertTo-Csv物件轉換成 CSV 字串,以及從 CSV 字串。 Export-CSV 與相同 ConvertTo-CSV,不同之處在於它會將 CSV 字串儲存在檔案中。