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.txt
C:\Bin
каталог .
(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt")
Примечание
В отличие от режима аргументов PowerShell, методы объектов выполняются в режиме выражения , который является сквозной передачей в платформу .NET Framework, на которой построен 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.