Поиск на сайте: Расширенный поиск


Новые программы oszone.net Читать ленту новостей RSS
CheckBootSpeed - это диагностический пакет на основе скриптов PowerShell, создающий отчет о скорости загрузки Windows 7 ...
Вы когда-нибудь хотели создать установочный диск Windows, который бы автоматически установил систему, не задавая вопросо...
Если после установки Windows XP у вас перестала загружаться Windows Vista или Windows 7, вам необходимо восстановить заг...
Программа подготовки документов и ведения учетных и отчетных данных по командировкам. Используются формы, утвержденные п...
Red Button – это мощная утилита для оптимизации и очистки всех актуальных клиентских версий операционной системы Windows...
OSzone.net Microsoft PowerShell Windows PowerShell: Снова о хитрых уловках с конвейером RSS

Windows PowerShell: Снова о хитрых уловках с конвейером

Текущий рейтинг: 4 (проголосовало 4)
 Посетителей: 9300 | Просмотров: 13947 (сегодня 0)  Шрифт: - +

В прошлом месяце я продемонстрировал замечательный прием, в котором использовалось привязка параметров конвейера и решение достаточно сложной задачи превращалось в однострочную команду Windows PowerShell.

Вкратце напомню, о чем шла речь: я создал файл в формате с разделителями-запятыми (comma-separated values, CSV) со списком учетных записей пользователей, которых нужно было создать в домене Active Directory. Я позаботился, чтобы заголовки столбцов в CSV-файле полностью совпадали с именами параметров командлета New-ADUser (он появился в Windows Server 2008 R2, но вполне годится и для доменов Windows Server 2003). Department, City, Name, GivenName, Surname и т. д. Так как в New-ADUser привязка конвейера ввода выполняется по имени свойства, особый выбор имен заголовков столбцов позволил мне создать нужных пользователей с помощью всего двух командлетов:

Import-CSV c:\new-users.csv | New-ADUser

Командлет Import-CSV возвращает по одному объекту на каждую строку CSV-файла, а свойства этих объектов совпадают с именами столбцов. Так как мой CSV-файл содержал все необходимые параметры командлета New-ADUser, мне не пришлось задавать их вручную. Впрочем, я мог отдельно указать отсутствующий в файле параметр, при условии, что он применим ко всем новым пользователям, например имя организации:

Import-CSV c:\new-users.csv | New-ADUser –organization "OurCompany"

Я считаю этот пример действительно демонстрирует мощь Windows PowerShell — во времена VBScript эту задачу пришлось бы решать объемистым сценарием (впрочем, ничто не запрещает пойти по этому пути и в Windows PowerShell). Но разобравшись с тем, как работает конвейер, и задействовав пару-тройку грамотно написанных командлетов, можно превратить большой сценарий в несколько простых команд.

В чем же проблема

Несколько особо въедливых читателей моего веб-сайта http://www.concentratedtech.com/ указали, что мой замечательный трюк работает только если заголовки столбцов в CSV-файле в точности соответствуют именам параметров в New-ADUser. На это можно рассчитывать, если файл создает администратор, но что делать, если файл пришел, скажем, из отдела управления персоналом, где названия столбцов могут не совпадать с точностью до буквы, а, значит, привязка свойств к параметрам не сработает?

Конечно, можно постоянно править файлы или базы данных, поступающие из отдела управления персоналом, но почему же не возложить эту рутину на компьютер, который и создан для выполнения рутинной работы? Естественно, Windows PowerShell предоставляет «лекарство» от плохих имен свойств — командлет Select-Object.

Это один из тех командлетов, которые чуть сложнее в освоении из-за огромной широты их возможностей. В частности, основная задача Select-Object — упрощение объектов путем изъятия свойств, которые не нужны в данный момент. Просто укажите нужные свойства, и командлет вернет сокращенную версию объекта. Это полезно для более четкого и понятного представления информации и текстовых файлов, например:

Get-WmiObject Win32_OperatingSystem | Select-Object BuildNumber,ServicePackMajorVersion

Другой способ использования Select-Object — отбор нужного подмножества объектов в конвейере за счет применения параметра –first или –last:

Get-Process | Sort VM –desc | Select –first 10

Обратите внимание: я задействовал псевдоним Select, а не полное имя командлета.

Решение

Еще одна недооцененная возможность Select-Object — способность не только отбирать, но и переименовывать нужные свойства. Если вы почитаете полную справочную информацию по командлету (Help Select –full — настоятельно рекомендую делать это с каждым командлетом), то наверняка обнаружите эту возможность и даже увидите несколько примеров ее применения. Вот такой пример:

Import-CSV c:\new-users.csv | Select @{Name="Surname";Expression={$_."Last Name"}}

Если в CSV-файле окажется столбец «Last Name», он будет переименован в «Surname», что соответствует имени параметра командлета New-ADUser. Я создал хеш-таблицу, которая также известна под именем «словарь» или «ассоциативный массив». Знак @ является в Windows PowerShell оператором массива; хеш-таблица представляет собой массив, состоящий из пар «параметр-значение». В данном случае параметром является имя создаваемого свойства, а значение — содержимое, которое надо присвоить этому свойству. В части с выражениями хеш-таблицы можно использовать переменную $_ для ссылки на текущий объект в конвейере. В данном примере я получил свойство «Last Name» (его нужно заключить в скобки, так как оно содержит пробел).

Командлету Select-Object можно передать сколько угодно объектов:

Import-CSV c:\new-users.csv | Select @{Name="Surname";Expression={$_."Last Name"}}, @{Name="GivenName";Expression={$_."First Name"}}

Секрет в том, что Select-Object возвращает ровно то, что ему сказано, — нельзя его заставить переименовать один или два столбца и выдать на выход эти столбцы плюс все остальное, что переименовывать не нужно. Обычно нужно указывать все свойства, которые должны поступать на выход командлета. Ясно, что если не нужно переименовывать каждый столбец CSV-файла, можно перечислить их как есть:

Import-CSV c:\new-users.csv | Select @{Name="Surname";Expression={$_."Last Name"}}, @{Name="GivenName";Expression={$_."First Name"}},
Department,Organization,Name

В данном случае Department, Organization и Name будут переданы без переименования, что нас вполне удовлетворяет, так как они точно соответствуют параметрам командлета New-ADUser.

Такой способ может показаться трудоемким, если столбцов много, но есть обходной путь:

Import-CSV c:\new-users.csv | Select
@{Name="Surname";Expression={$_."Last Name"}},
@{Name="GivenName";Expression={$_."First Name"}},
*

Звездочка (*) заставит вернуть все свойства входного объекта в добавление к созданным мной свойствам Surname и GivenName. Допустим, у меня есть такой CSV-файл:

First Name,Last Name,Department,Name
Don,Jones,IT,DonJ
Greg,Shields,Janitorial,GregS
Jeff,Hicks,IT,JeffH

Я могу задействовать следующие два командлета:

Import-CSV c:\new-users.csv | Select @{Name="Surname";Expression={$_."Last Name"}}, @{Name="GivenName";Expression={$_."First Name"}},
*

И у моих выходных объектов будут шесть свойств: First Name, Last Name, Department, Name, Surname и GivenName. Иначе говоря, все исходные свойства плюс добавленные мной. Далее я применяю командлет New-ADUser:

Import-CSV c:\new-users.csv | Select @{Name="Surname";Expression={$_."Last Name"}}, @{Name="GivenName";Expression={$_."First Name"}},
* | New-ADUser

Командлет New-ADUser ничего не сможет сделать со свойствами «First Name» и «Last Name», так как они не совпадают с именем ни одного из параметров командлета. И это правильно: командлет просто проигнорирует все свойства, к которым не сможет привязаться, но привяжется к остальным — в данном случае к Surname, GivenName, Department и Name — и создаст новые учетные записи пользователей.

Перестраиваем мозги на новый лад

Я понял, что одна из особенностей работы с Windows PowerShell — никогда не сдаваться. Иначе говоря, если нельзя задействовать полученный CSV-файл из-за неподходящих названий столбцов, не надо сразу же пытаться менять сам файл! Windows PowerShell позволяет выкрутиться практически из любой ситуации — надо лишь внимательно изучить вопрос.

А теперь расскажите, в какие непростые ситуации попадали вы, работая с Windows PowerShell? Мне это страшно интересно, вполне возможно, что я решу вашу проблему и это станет темой следующей статьи! Задавайте свои вопросы на сайте http://www.concentratedtech.com/, где я в онлайновом режиме смогу дать немедленный ответ, получить от вас дополнительную информацию и, вероятно, получить материал для новой статьи в TechNet Magazine.

Дон Джонс (Lance Whitney) — один из самых опытных в стране преподавателей и писателей, специализирующихся в области Windows PowerShell. Еженедельно публикует свои советы по Windows PowerShell на сайте ConcentratedTech.com; там же вы можете написать ему или задать вопрос.

Связанное содержимое

Автор: Дон Джонс  •  Иcточник: TechNet Magazine  •  Опубликована: 20.05.2010
Нашли ошибку в тексте? Сообщите о ней автору: выделите мышкой и нажмите CTRL + ENTER
Теги:   Windows PowerShell.


Оценить статью:
Вверх
Комментарии посетителей
Комментарии отключены. С вопросами по статьям обращайтесь в форум.