Как использовать Import-CSV в PowerShell
Работая с PowerShell, мы можем использовать файлы CSV для импорта данных в системы или для использования их в качестве справочного списка, например, пользователей, чтобы обновить или получить настройки. Для этого мы используем функцию Import-CSV в PowerShell.
Функция Import-CSV преобразует данные CSV в пользовательский объект в PowerShell. Таким образом, мы можем легко пройтись по каждой строке файла CSV и использовать данные в наших скриптах.
В этой статье мы рассмотрим, как читать CSV файл с помощью PowerShell, используя функцию Import-CSV, а также как читать каждую строку с помощью команды foreach. Я также дам вам несколько советов о том, как использовать функцию Import CSV.
Импорт-CSV в PowerShell
Командлет Import-CSV довольно прост и имеет всего несколько полезных свойств:
- Путь - (Обязательно) Местоположение CSV файла
- Разделитель – По умолчанию запятая, но это позволяет вам изменить его
- Заголовок – Позволяет определять пользовательские заголовки для столбцов. Используется как имена свойств
- UseCulture – Используйте разделитель по умолчанию вашего устройства
- Кодировка – Укажите кодировку импортируемого файла CSV
Мы начнем с простого списка пользователей, который мы можем импортировать в PowerShell. Я создал следующий CSV-файл, который использую в следующих примерах:
UserPrincipalName,"DisplayName","Title","UserType","IsLicensed"
LeeG@lazydev.com,"Lee Gu","jr engineer","Member","True"
MeganB@lazydev.com,"Megan Bowen","recruiter","Member","True"
GradyA@lazydev.com,"Grady Archie","sr engineer","Member","True"
MiriamG@lazydev.com,"Miriam Graham","Director","Member","True"
openmailbox@lazydev.com,"openmailbox",,"Member","False"
JohannaL@lazydev.com,"Johanna Lorenz","Senior Engineer","Member","True"
JoniS@lazydev.com,"Joni Sherman","recruiter","Member","False"
AlexW@lazydev.com,"Alex Wilber","Marketing Assistant","Member","True"
IsaiahL@lazydev.com,"Isaiah Langer","Sales Rep","Member","True"
Этот CSV файл уже имел заголовки для каждого столбца, поэтому нам не нужно беспокоиться об этом пока. Чтобы импортировать этот CSV файл в PowerShell, мы можем просто использовать следующую команду:
Import-CSV -Path c:\temp\test.csv | ftВ этом случае мы не сохраняем результаты в переменной, а сразу выводим их в таблицу с помощью ft. Как видите, теперь у нас есть все наши пользователи со всеми колонками аккуратно в PowerShell.
Если вы сохраните результаты командлета импорта в переменной, вы сможете обращаться к каждому столбцу как к свойству, используя имя столбца (заголовок):
$users = Import-Csv -Path c:\temp\test.csv
$users.DisplayNameУказание разделителя
Распространенная проблема при импорте CSV файла с помощью PowerShell заключается в том, что разделитель не распознается. По умолчанию команда Import-CSV использует , в качестве разделителя. Но здесь, в Нидерландах, например, по умолчанию в Excel для CSV файлов используется ;.
Итак, когда я создаю CSV-файл в Excel, который хочу использовать в PowerShell, мне нужно будет либо изменить разделитель в 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
Импорт CSV в PowerShell для каждого
Большую часть времени, когда вы импортируете CSV файл в PowerShell, вы хотите пройтись по каждой строке CSV файла. Например, чтобы получить разрешения на почтовый ящик или размер папки OneDrive.
Для этого мы можем объединить командлет Import CSV с 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.
Добавление заголовков к Import-CSV
Давайте возьмем следующий CSV-файл с именами серверов и IP-адресами серверов:
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 файл не имеет заголовков (имен столбцов). Поэтому, когда мы импортируем этот CSV файл напрямую в PowerShell, вы увидите, что первая строка используется в качестве заголовка. Это не сработает.
Итак, что нам нужно сделать, это определить заголовки для CSV файла. Нам нужно перечислить все заголовки в строке, разделенной запятыми, заключив каждое имя заголовка в одинарные кавычки.
Import-Csv -Path c:\temp\server.csv -Header 'ServerName','IpAddress'
Важно знать, что если вы не указываете все заголовки, оставшиеся столбцы не импортируются. Поэтому, если мы расширим наш 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Другой вариант - использовать параметр -header, но это работает хорошо только в том случае, если вам нужна только первая колонка (или первые несколько колонок). Поскольку вы не можете пропустить колонку с помощью этого метода:
Import-Csv -Path c:\temp\test.csv -Header id
Result
id
--
UserPrincipalName
LeeG@lazydev.com
MeganB@lazydev.com
GradyA@lazydev.com
MiriamG@lazydev.com
openmailbox@lazydev.com
JohannaL@lazydev.com
JoniS@lazydev.com
AlexW@lazydev.com
IsaiahL@lazydev.comНайдите значения в CSV файле
Иногда вы просто хотите найти конкретное значение или столбец в файле CSV. Для этого вам нужно знать названия столбцов. Мы можем импортировать файл CSV, а затем выбрать только те записи, где столбец соответствует заданной строке. Затем вы можете вернуть либо всю строку, либо конкретный столбец:
$csv = Import-CSV -path c:\temp\test.csv
$csv | Where-Object {$_.UserPrincipalName -eq 'AlexW@lazydev.com'} | Select Title
Result
Title
-----
Marketing AssistantЗаключение
Команда Import-CSV в PowerShell действительно полезна, когда вам нужно работать со списками или хотите искать несколько сущностей. Убедитесь, что вы проверили, содержит ли CSV-файл заголовки и используете ли вы правильный разделитель.
Если у вас есть вопросы, просто оставьте комментарий ниже.





