Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также любые проблемы программирования на различных макроязыках и в скриптовых средах)

Работа с содержимым файлов, классами .NET и COM-объектами в Windows Monad Shell

Работа с текстовыми, CSV и XML файлами

Есть несколько команд-летов, которые будут использоваться постоянно: 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 и вызов методов библиотеки классов

Когда в сценарии используются квадратные скобки, они указывают оболочке, что заключённая в них строка - ссылка .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)

Работа с COM-объектами

Опция -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 При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.