Import-CSV:使用 PowerShell 讀取 CSV 文件

Jacki

您可以使用導入-CSV用於讀取 CSV 文件內容的 PowerShell cmdlet。加載 CSV 文件的內容後,您將獲得一個 PowerShell 對象,其中 CSV 文件中的每一列都是一個單獨的屬性。本文討論使用 Import-CSV cmdlet 從 CSV 文件讀取數據的具體細節。

CSV 文件用於存儲表格數據。例如,我們創建了一個簡單的 Excel 電子表格,其中包含 AD 用戶信息,其結構如下:ADlogin,Email,Phone,Department。請注意,電子表格的第一行包含列名稱。在 PowerShell 中,這些將作為數組中的對象屬性提供。

我們的任務是將此 CSV 文件導入到 PowerShell 中,並從該文件中為每個用戶更改 Active Directory。

在上一篇文章中,我們解釋瞭如何使用 Export-CSV cmdlet 將 PowerShell 對象保存到 CSV 文件。

閱讀更多:使用 PowerShell 從 CSV 導入 AD 用戶

將此 Excel 文件另存為包含逗號分隔值的 CSV 文件。生成的文本文件應如下所示:

現在,要將 CSV 文件導入 PowerShell,您所要做的就是指定其名稱(路徑):

$ADUsers=Import-CSV -path C:PSmy_ad_users.csv

Import-CSV cmdlet 將數據從 CSV 文件轉換為 PowerShell 數組。

如果 CSV 文件使用逗號以外的分隔符,您可以使用-分隔符範圍。例如,要導入帶有分號分隔符的 CSV 文件 (;)使用命令:

$ADUsers=Import-CSV -path C:PSmy_ad_users.csv -Delimiter ";"

如果在 CSV 中使用製表符作為分隔符,則可以按如下方式指定:-Delimiter `t

如果您想在系統中使用默認分隔符(取決於語言和區域 Windows 設置),請使用-UseCulture旗幟。

運行以下命令以獲取 Windows 中的系統默認分隔符:

(Get-Culture).TextInfo.ListSeparator

現在,如果您調用 $ADUsers 變量,它將顯示 CSV 文件的內容。該 cmdlet 將文件的內容轉換為數組。 CSV 文件中的所有值均表示為行。

如果您的 CSV 文件包含 UTF-8 字符編碼,請確保還指定 UTF8 類型以避免編碼錯誤:

Import-CSV -path C:PSmy_ad_users.csv -Encoding UTF8

可用對象屬性的列表可以顯示如下:

$ADUsers|get-member

您可以看到數組行包含 PSCustomObjects,可以通過 CSV 文件中的列名稱訪問其元素。

您可以顯示特定列中的所有值:

$ADusers.email

或者指定對象屬性:

$ADusers| Select-Object Email, Phone

另一個有用的選項是直接訪問數組中的特定對象。例如,運行以下命令獲取第 4 行的值(編號從 0 開始):

$ADusers[3]

如果要更改在 CSV 文件中指定的 Active Directory 用戶的屬性,只需使用 ForEach 循環迭代 $ADUsers 數組中的所有行(我們將使用 AD PowerShell 模塊中的 Set-ADUser cmdlet 進行更改)。

# Iterating over all the rows in the array one by one
$ADUsers | ForEach-Object {
# In this example, the $_. statement means we are accessing the current row of the array You can get the value of a particular column from the current row by accessing it by the column name. For example, to display the ADLogin value from the current line:
Write-host $_.ADLogin
# Now we search for a user in AD by the value of the ADLogin column and change its attribute values:
Set-ADUser -Identity $_.AdLogin -MobilePhone $_.Phone –Department $_.Department –EmailAddress $_.Email
}

您可以將此腳本替換為更緊湊的 PowerShell 單行腳本:

Import-Csv C:PSmy_ad_users.csv | foreach {Set-ADUser -Identity $_.AdLogin -MobilePhone $_.Phone –Department $_.Department –EmailAddress $_.Email}

有時您可能會發現下面的格式更方便。這裡我們通過以下方式訪問數組的當前行$User我們在 ForEach 語句中定義的變量:

ForEach ($User in $ADUsers){
$samaccountname = $User.ADlogin
$email = $user.Email
Write-host $samaccountname
Write-host $email
}

在某些情況下,在處理 CSV 文件中的數組元素時,您可能需要向數組添加額外的列。例如,如果要將當前日期添加到 $ADUsers 對象:

$ADUsers | add-member -membertype NoteProperty -name Date -value (Get-Date -Format dd/MM/yyyy)

以下是您可以使用 Import-CSV cmdlet 對大量對象執行管​​理操作的更多場景:

  • 將 Exchange 郵箱導出到 PST 文件:
    Import-CSV "C:psuser_to_export_pst.csv" | ForEach {New-MailboxExportRequest -Mailbox $_.username -FilePath $_.UNCPathtoPst
  • 使用 PowerShell 將用戶添加到 AD 安全組:I
    mport-CSV .users.csv -Header users | ForEach-Object {Add-AdGroupMember -Identity ‘TestADGroup’ -members $_.users}
    或者將用戶添加到 Microsoft Entra ID (Azure AD) 組的類似情況:
    Import-CSV "C:PSadd_m365_members.csv" | ForEach-Object {
    Add-UnifiedGroupLinks –Identity it_dept –LinkType Members –Links $_.member
    }
  • 從AD獲取用戶信息:
    Import-Csv c:psusernsme_list.csv | ForEach {
    Get-ADUser -identity $_.user -Properties Name, telephoneNumber |
    Select Name, telephoneNumber |
    Export-CSV c:psexport_ad_list.csv -Append -Encoding UTF8
    }
    或者使用 Set-ADUser 更改特定用戶的屬性:Import-Csv "C:psmodifyad_users.csv" | foreach {Set-ADUser -Identity $_.SamAccountName –Title $_.Title -MobilePhone $_.MobilePhone}更新 Active Directory 中的用戶照片:
    Import-Csv C:PSimport.csv |%{Set-ADUser -Identity $_.AD_username -Replace @{thumbnailPhoto=([byte[]](Get-Content $_.Photo -Encoding byte))}}
  • 從 CSV 文件中的列表在 Active Directory 中創建批量用戶。