Перейти на главную страничку сайта (список статей, файлы для скачивания)
Есть несколько команд-летов, которые будут использоваться постоянно: where-object, sort-object, select-object, format-table и др. Есть также несколько универсальных и простых приёмов работы, которые не были рассмотрены в предыдущих статьях и будут рассмотрены здесь.
Команд-лет select-object имеет два дополнительных параметра командной строки, -first и -last, которые задают количество объектов с учётом их последовательности, например:
MSH> get-childitem | select-object -first 10 MSH> get-childitem | select-object -last 10
Команд-лет select-object имеет также опцию -unique, которая может использоваться, чтобы были возвращены только уникальные объекты:
MSH> get-service | select-object Status -unique MSH> "aa","aa","bb" | select-object -unique
Команд-лет measure-object может использоваться в любом конвейере, чтобы получить статистику об объектах, которые прошли через конвейер. Опция -Property используется, чтобы указать специфическое свойство входящих объектов в комбинации с параметрами, задающими "функцию" по этому свойству: -Average, -Sum, -Min, -Max. Например:
MSH> get-childitem | measure-object -Property Length -Average -Sum -Min -Max
Приведённая ниже функция выведет указанное число первых элементов объекта, который ей передан, например, строк файла или элементов массива. После функции приводится два примера её вызова, в т.ч. вызов в конвейере:
function head { param($filename, $count = 10) if ($filename) { $source = get-content $filename } else { $source = $input } $source | select-object -first $count } head "C:\boot.ini" "раз", "два", "три" | head "" 2
Команд-лет get-content читает файл и помещает каждую строку содержимого в конвейер:
get-content "C:\boot.ini"
А вот так можно получить статистику строк, слов и символов файла:
get-content "C:\boot.ini" | measure-object -lines -words -characters
Команд-лет out-file выводит содержимое конвейера в файл:
get-process | out-file raw.txt get-content raw.txt
Поэкранный вывод содержимого файла:
get-content longfile.txt | more
Команд-лет export-csv записывает CSV-файл (опция -NoTypeInformation подавляет первую строку вывода):
get-process | export-csv -NoTypeInformation processes.csv
Команд-лет import-csv читает CSV-файл, анализирует поля и генерирует объекты, соответствующие каждой строке в файле:
$tasks = import-csv processes.csv foreach ($task in $tasks) { echo $task.Description }
Можно работать с XML-файлами. Пример файла, содержащего задачи для резервного копирования:
<Jobs> <Job Name="First"> <Source>\\server1\files</Source> <Destination>\\server2\backup</Destination> <File>a.txt</File> <File>b.txt</File> </Job> <Job Name="Second"> <Source>\\server1\files</Source> <Destination>\\server3\backup</Destination> <File>c.txt</File> <File>d.txt</File> <File>e.txt</File> </Job> </Jobs>
Вот сценарий, который выполняет задачи, описанные в вышеприведённом XML-файле:
$xml = [Xml]$(get-content Test.xml) foreach ($job in $xml.Jobs.Job) { $job.Name foreach ($file in $job.File) { $source = combine-path $job.Source $file $dest = combine-path $job.Destination $file echo $source echo $dest # copy-item $source $dest } }
Когда в сценарии используются квадратные скобки, они указывают оболочке, что заключённая в них строка - ссылка .NET Framework. Такая ссылка может быть в форме полностью квалифицированного класса [System.Xml.XmlDocument], имени класса в пределах пространства имён [string], или одного из нескольких ярлыков, например, [Xml] или [Regex].
C другой стороны, MSH пытается автоматически определить тип данных .NET там, где он не указан явно (например, int, double, decimal, string). Также производится автоматическое преобразование типов при выполнении операций над переменными. Используя квадратные скобки перед именем переменной или значением, вы можете вынудить MSH конвертировать значение к нужному типу:
MSH> $a = [int]3.21 MSH> $a 3 MSH> [int]$b = 1.2 MSH> $b 1 MSH> $b = "строка" Cannot convert "строка" to "System.Int32".
Многие типы могут быть автоматически сконвертированы из строки и обратно:
MSH> $moonDay = [datetime]"1969-5-20" MSH> $moonDay 20 мая 1969 г. 0:00:00 MSH> [string]$moonDay 20.05.1969 0:00:00
MSH> $suc = [System.Security.AccessControl.AuditFlags]"Success" MSH> $suc Success
Если тип .NET - перечисление, все его возможные значения могут быть перечислены статическим методом GetNames класса Enum:
MSH> [Enum]::GetNames([System.Security.AccessControl.AuditFlags]) None Success Failure
Обращение к свойствам и методам объектов производится через точку (точки) и может идти в произвольную "глубину".
Например, строки имеют богатый набор методов:
MSH> $a = "Hello, World!" MSH> $a.Substring(7) World! MSH> $a.Substring(0, 5) Hello MSH> $a.StartsWith("He") True MSH> $a = $a.Replace("World", "everyone") MSH> $a Hello, everyone!
Некоторые классы также выставляют статические методы и свойства. Вместо того чтобы оперировать специфическим объектом, их можно вызывать и использовать непосредственно. В этих случаях между именем класса и его статическим методом или свойством используется двойное двоеточие:
MSH> [System.DateTime]::Now 8 апреля 2050 г. 19:07:58 MSH> [System.Diagnostics.Process]::Start("calc.exe")
Команд-лет new-object создает объект по имени класса. Конструктор класса может иметь и дополнительные параметры:
MSH> $myVersion = new-object System.Version 1,2,3,4 MSH> $myVersion Major Minor Build Revision ----- ----- ----- -------- 1 2 3 4
Команд-лет new-object похож на запись []. Однако вместо того, чтобы иметь необходимость писать $myVersion.Major = 1; $myVersion.Minor = 2; и так далее, мы получили более компактный синтаксис конструктора.
Команд-лет get-member может использоваться для получения информации о свойствах и методах класса:
MSH> [string]"" | get-member -MemberType Method | >> where-object { $_.Name -eq "substring" } | format-list TypeName : System.String Name : Substring MemberType : Method Definition : System.String Substring(Int32 startIndex), System.String Substring (Int32 startIndex, Int32 length)
Опция -ComObject команд-лета new-object позволяет работать с COM-объектами (ActiveX):
$ie = new-object -ComObject "InternetExplorer.Application" $ie | get-member -MemberType Method
Далее можно вызывать через точку методы и обращаться к свойствам объекта:
$ie.Navigate("about:blank") $ie.Visible = $true
Другой пример:
$ui = new-object -ComObject "Shell.Application" $path = $ui.BrowseForFolder(0, "Select a folder", 0, 0)
Перейти на главную страничку сайта (список статей, файлы для скачивания)
© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.