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 необходимо разрешить путь к собственному пути файловой системы.
См. также
PowerShell