Поделиться через


about_Methods

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

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

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

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

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

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

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

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.txtC:\Bin каталог .

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

Примечание

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

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

В следующем примере используется второй CopyTo метод для копирования файла в Final.txtC:\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.

См. также раздел