about_Methods

Краткое описание

Описывает, как использовать методы для выполнения действий над объектами в PowerShell.

Подробное описание

PowerShell использует объекты для представления элементов в хранилищах данных или состоянии компьютера. Например, объекты FileInfo представляют файлы на дисках файловой системы и объекты ProcessInfo представляют процессы на компьютере.

Объекты имеют свойства, которые хранят данные об объекте и методах, которые позволяют изменять объект.

Метод — это набор инструкций, указывающих действие, которое можно выполнить на объекте. Например, объект включает CopyTo метод, FileInfo копирующий файл, который FileInfo представляет объект.

Чтобы получить методы любого объекта, используйте Get-Member командлет. Используйте его свойство MemberType со значением "Method". Следующая команда получает методы объектов процесса.

Get-Process | Get-Member -MemberType Method
TypeName: System.Diagnostics.Process

Name                      MemberType Definition
----                      ---------- ----------
BeginErrorReadLine        Method     System.Void BeginErrorReadLine()
BeginOutputReadLine       Method     System.Void BeginOutputReadLine()
...
Kill                      Method     System.Void Kill()
Refresh                   Method     System.Void Refresh()
Start                     Method     bool Start()
ToString                  Method     string ToString()
WaitForExit               Method     bool WaitForExit(int milliseconds), ...
WaitForInputIdle          Method     bool WaitForInputIdle(int millisecon...

Чтобы выполнить или "вызвать" метод объекта, введите точку (.), имя метода и набор скобок "()". Если метод имеет аргументы, поместите значения аргументов в скобки. Скобки необходимы для каждого вызова метода, даже если аргументов нет. Если метод принимает несколько аргументов, они должны быть разделены запятыми.

Например, следующая команда вызывает метод Kill процессов для завершения процесса Блокнота на компьютере.

$notepad = Get-Process notepad
$notepad.Kill()

Этот пример можно сократить, объединив приведенные выше инструкции.

(Get-Process Notepad).Kill()

Команда Get-Process заключена в скобки, чтобы убедиться, что она выполняется перед вызовом метода Kill. Затем Kill метод вызывается для возвращаемого Process объекта.

Другой очень полезный Replace метод — это метод строк. Метод Replace заменяет текст в строке. В приведенном ниже примере точка (.) может быть помещена сразу после конца кавычки строки.

'this is rocket science'.Replace('rocket', 'rock')
this is rock science

Как показано в предыдущих примерах, можно вызвать метод для объекта, который вы получаете с помощью команды, объекта в переменной или объекта, который приводит к объекту (например, строке в кавычках).

Начиная с PowerShell 4.0, вызов метода с помощью динамических имен методов поддерживается.

Изучение методов

Чтобы найти определения методов объекта, перейдите к разделу справки по типу объекта и найдите страницу методов. Например, на следующей странице описываются методы объектов обработки System.Diagnostics.Process.

Чтобы определить аргументы метода, ознакомьтесь с определением метода, который похож на синтаксическую схему командлета PowerShell.

Определение метода может иметь одну или несколько сигнатур методов, которые похожи на наборы параметров командлетов PowerShell. Сигнатуры отображают все допустимые форматы команд для вызова метода.

Например, CopyTo метод FileInfo класса содержит следующие два сигнатуры метода:

    CopyTo(String destFileName)
    CopyTo(String destFileName, Boolean overwrite)

Первая сигнатура метода принимает имя целевого файла (и путь). В следующем примере используется первый CopyTo метод для копирования Final.txt файла в C:\Bin каталог.

(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt")

Примечание.

В отличие от режима аргумента PowerShell методы объектов выполняются в режиме выражения, который является сквозной платформой .NET, на которой основана PowerShell. В режиме выражения аргументы без аргументов (неквотируемые строки) не допускаются. Это различие можно увидеть при использовании пути в качестве параметра и пути в качестве аргумента. Дополнительные сведения о режимах синтаксического анализа см. в about_Parsing

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

В следующем примере используется второй CopyTo метод для копирования Final.txt файла в C:\Bin каталог и перезаписи существующих файлов.

(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt", $true)

Перечисление доступа к членам

Начиная с PowerShell 3.0 при использовании оператора доступа к членам (.) для доступа к методу, который не существует в коллекции списков, PowerShell автоматически перечисляет элементы в коллекции и вызывает метод для каждого элемента. Дополнительные сведения см. в разделе about_Member-Access_Enumeration.

Примеры

В следующем примере выполняется метод Kill отдельных объектов процесса в коллекции объектов.

Первая команда запускает три экземпляра процесса Блокнота. Get-Process получает все три экземпляра процесса Блокнота и сохраняет их в переменной $p .

Notepad; Notepad; Notepad
$p = Get-Process Notepad
$p.Count
3

Следующая команда запускает метод Kill во всех трех процессах в переменной $p . Эта команда работает, даже если коллекция процессов не имеет Kill метода.

$p.Kill()
Get-Process Notepad

Команда Get-Process подтверждает, что Kill метод работал.

Get-Process : Cannot find a process with the name "notepad". Verify the proc
ess name and call the cmdlet again.
At line:1 char:12
+ Get-Process <<<<  notepad
    + CategoryInfo          : ObjectNotFound: (notepad:String) [Get-Process]
, ProcessCommandException
    + FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShel
l.Commands.GetProcessCommand

Этот пример функционально эквивалентен использованию командлета Foreach-Object для запуска метода для каждого объекта в коллекции.

$p | ForEach-Object {$_.Kill()}

Методы ForEach и Where

Начиная с PowerShell 4.0, фильтрация коллекции с помощью синтаксиса метода поддерживается. Это позволяет использовать два новых метода при работе с коллекциями ForEach и Where.

Дополнительные сведения об этих методах в см. в разделе about_arrays.

Вызов определенного метода при наличии нескольких перегрузок

Рассмотрим следующий сценарий при вызове методов .NET. Если метод принимает объект, но имеет перегрузку через интерфейс, принимаюющий более конкретный тип, PowerShell выбирает метод, который принимает объект, если вы явно не приведение его к интерфейсу.

Add-Type -TypeDefinition @'

   // Interface
   public interface IFoo {
     string Bar(int p);
   }

   // Type that implements the interface
   public class Foo : IFoo {

   // Direct member method named 'Bar'
   public string Bar(object p) { return $"object: {p}"; }

   // *Explicit* implementation of IFoo's 'Bar' method().
   string IFoo.Bar(int p) {
       return $"int: {p}";
   }

}
'@

В этом примере выбрана менее конкретная object перегрузка метода Bar .

[Foo]::new().Bar(1)
object: 1

В этом примере мы приведение метода к интерфейсу IFoo для выбора более конкретной перегрузки метода Bar .

([IFoo] [Foo]::new()).Bar(1)
int: 1

Использование методов .NET, которые принимают пути файловой системы

PowerShell поддерживает несколько пространств выполнения для каждого процесса. Каждое пространство выполнения имеет собственный текущий каталог. Это не то же самое, что и рабочий каталог текущего процесса: [System.Environment]::CurrentDirectory

Методы .NET используют рабочий каталог процесса. Командлеты PowerShell используют расположение Runspace. Кроме того, методы .NET работают только с собственными путями файловой системы, а не с объектами Пути PowerShell. Чтобы использовать пути PowerShell с методами .NET, перед передачей в метод .NET необходимо разрешить путь к собственному пути файловой системы.

См. также