当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何在 PowerShell 中使用导入 CSV

作者:精品下载站 日期:2024-12-14 03:41:56 浏览:13 分类:玩电脑

如何在 PowerShell 中使用导入 CSV


使用 PowerShell 时,我们可以使用 CSV 文件将数据导入系统或将其用作用户的参考列表,例如更新或获取设置。为此,我们使用 PowerShell 中的 Import-CSV 函数。

Import-CSV 函数将 CSV 数据转换为 PowerShell 中的自定义对象。这样我们就可以轻松浏览 CSV 文件的每一行并在脚本中使用数据。

在本文中,我们将了解如何使用 PowerShell、使用 Import-CSV 函数读取 CSV 文件,以及如何使用 foreach cmdlet 读取每一行。我还将为您提供一些有关如何使用导入 CSV 功能的提示。

PowerShell 导入-CSV

Import-CSV cmdlet 非常简单,只有一些有用的属性:

  • 路径 - (必需)CSV 文件的位置
  • 分隔符 - 默认逗号,但这允许您更改它
  • 标题 - 允许您定义列的自定义标题。用作属性名称
  • UseCulture - 使用系统的默认分隔符
  • 编码 - 指定导入的 CSV 文件的编码

我们将从可以在 PowerShell 中导入的简单用户列表开始。我创建了以下 CSV 文件,我将在下面的示例中使用该文件:

UserPrincipalName,"DisplayName","Title","UserType","IsLicensed"
[email protected],"Lee Gu","jr engineer","Member","True"
[email protected],"Megan Bowen","recruiter","Member","True"
[email protected],"Grady Archie","sr engineer","Member","True"
[email protected],"Miriam Graham","Director","Member","True"
[email protected],"openmailbox",,"Member","False"
[email protected],"Johanna Lorenz","Senior Engineer","Member","True"
[email protected],"Joni Sherman","recruiter","Member","False"
[email protected],"Alex Wilber","Marketing Assistant","Member","True"
[email protected],"Isaiah Langer","Sales Rep","Member","True"

这个 CSV 文件已经有每列的标题,所以我们现在不需要担心这个。要将这个 CSV 文件导入 PowerShell,我们只需使用以下命令:

Import-CSV -Path c:\temp\test.csv | ft

在这种情况下,我们不会将结果存储到变量中,而是立即使用 ft 将其输出到表中。正如您所看到的,现在我们的所有用户都可以在 PowerShell 中很好地使用所有列。

[玩转系统] 如何在 PowerShell 中使用导入 CSV

如果将 import cmdlet 的结果存储到变量中,则可以使用列名称(标题)将每列作为属性引用:

$users = Import-Csv -Path c:\temp\test.csv
$users.DisplayName

[玩转系统] 如何在 PowerShell 中使用导入 CSV

指定分隔符

使用 PowerShell 导入 CSV 文件时的一个常见问题是无法识别分隔符。默认情况下,Import-CSV cmdlet 使用 , 作为分隔符。但以荷兰为例,Excel 中 CSV 文件的默认分隔符是 ;

因此,当我在 Excel 中创建要在 PowerShell 中使用的 CSV 文件时,我需要更改 CSV 文件中的分隔符或在 PowerShell 中指定正确的分隔符。有两种选择。

我们可以使用 -delimiter 参数来指定正确的分隔符:

$users = Import-Csv -Path c:\temp\test.csv -Delimiter ;

或者使用系统默认分隔符和 -UseCulture 参数:

$users = Import-Csv -Path c:\temp\test.csv -UseCulture

如果您想知道计算机上的默认分隔符是什么,可以使用以下 PowerShell 命令来获取区域性信息:

(Get-Culture).TextInfo.ListSeparator

[玩转系统] 如何在 PowerShell 中使用导入 CSV

Powershell 导入 CSV ForEach

大多数情况下,当您在 PowerShell 中导入 CSV 文件时,您希望浏览 CSV 文件的每一行。例如获取邮箱权限或 OneDrive 文件夹大小。

为此,我们可以将 Import CSV cmdlet 与 ForEach 结合起来。在本例中,在 ForEach 块内,我们可以将 CSV 文件的每一列引用为用户对象的属性。

以我在文章开头添加的 CSV 文件示例为例,我们可以使用 UserPrincipalName 获取每个用户的邮箱,如下所示:

Import-CSV -Path C:\temp\test.csv | ForEach {
    # Get mailbox of each user
    Get-ExoMailbox -identity $_.UserPrincipalName
}

为此,您的 CSV 文件需要有标题。情况并非总是如此,有时 CSV 文件仅包含值,根本不包含标题。

为了仍然能够引用 CSV 文件中的每个值,您需要将标头添加到 Import-CSV 文件 cmdlet。

将标头添加到 Import-CSV

让我们使用以下包含服务器名称和服务器 IP 地址的 CSV 文件:

la-ams-ad01,10.15.0.1
la-ams-file02,10.15.0.3
la-ams-db01,10.15.0.4
la-osl-ad01,10.12.0.1
la-osl-file01,10.12.0.5

如您所见,此 CSV 文件没有标题(列名称)。因此,当我们直接在 PowerShell 中导入此 CSV 文件时,您将看到第一行用作标题。这是行不通的。

[玩转系统] 如何在 PowerShell 中使用导入 CSV

所以我们需要做的是定义 CSV 文件的标题。我们需要以逗号分隔的字符串列出所有标头,并用单引号将每个标头名称括起来 '

Import-Csv -Path c:\temp\server.csv -Header 'ServerName','IpAddress'

[玩转系统] 如何在 PowerShell 中使用导入 CSV

需要注意的是,如果您不指定所有标题,则不会导入其余列。因此,如果我们使用以下列扩展 CSV 文件:

la-ams-ad01,10.15.0.1,HP,DL365 G10
la-ams-file02,10.15.0.3,HP,DL380 G9
la-ams-db01,10.15.0.4,HP,DL385 G10
la-osl-ad01,10.12.0.1,HP,DL110 G8
la-osl-file01,10.12.0.5,HP,DL345 G10

并且仅指定三个列标题,则不会导入最后一列(本例中的服务器型号):

Import-Csv -Path c:\temp\server.csv -Header 'ServerName','Ip','Brand'

# Result:
ServerName    Ip        Brand
----------    --        -----
la-ams-ad01   10.15.0.1 HP
la-ams-file02 10.15.0.3 HP
la-ams-db01   10.15.0.4 HP
la-osl-ad01   10.12.0.1 HP
la-osl-file01 10.12.0.5 HP

如果定义的标题多于列,则会为每个对象创建一个附加的空属性。如果您想创建一个带有稍后要填充的其他字段的对象,这会很有用。例如,如果要查找每个服务器的磁盘空间,我们已经可以将磁盘空间列添加到导入的数据中:

Import-Csv -Path c:\temp\server.csv -Header 'ServerName','Ip','Brand','Model','DiskSpace' | ft

# Result
ServerName    Ip        Brand Model     DiskSpace
----------    --        ----- -----     ---------
la-ams-ad01   10.15.0.1 HP    DL365 G10
la-ams-file02 10.15.0.3 HP    DL380 G9
la-ams-db01   10.15.0.4 HP    DL385 G10
la-osl-ad01   10.12.0.1 HP    DL110 G8
la-osl-file01 10.12.0.5 HP    DL345 G10

例如,这允许我们执行以下操作:

$servers = Import-Csv -Path c:\temp\server.csv -Header 'ServerName','Ip','Brand','Model','DiskSpace'

$servers | ForEach {
    $_.DiskSpace = Invoke-Command -ComputerName $_.ServerName {Get-PSDrive C} | Select-Object Free
}

如何使用 Import-CSV 仅导入特定字段

当您将 CSV 文件导入 PowerShell 时,默认情况下它将导入所有列。但是,在处理大文件时,仅选择您真正需要的数据可能会很有用。

有两种方法可以做到这一点,如果您的 CSV 文件有标题,那么您可以仅选择您需要的列:

Import-Csv -Path c:\temp\test.csv | select DisplayName,Title | Ft

[玩转系统] 如何在 PowerShell 中使用导入 CSV

另一种选择是使用 -header 参数,但这仅在您只需要第一列(或前几列)时才有效。因为你不能用这种方法跳过一列:

Import-Csv -Path c:\temp\test.csv -Header id

# Result
id
--
UserPrincipalName
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]

在 CSV 文件中查找值

有时您只想查找 CSV 文件中的特定值或列。为此,您需要知道列名称。我们可以导入 CSV 文件,然后仅选择列与指定字符串匹配的记录。然后,您可以返回整行或特定列:

$csv = Import-CSV -path c:\temp\test.csv
$csv | Where-Object {$_.UserPrincipalName -eq '[email protected]'} | Select Title

# Result
Title
-----
Marketing Assistant

总结

当您需要使用列表或想要查找多个实体时,PowerShell 中的 Import-CSV cmdlet 非常有用。确保检查 CSV 文件是否带有标题,并且使用了正确的分隔符。

如果您有任何疑问,请在下面发表评论。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯