Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Краткое описание
Описывает, как использовать методы для выполнения действий над объектами в PowerShell.
Длинное описание
PowerShell использует объекты для представления элементов в хранилищах данных или состоянии компьютера. Например, объекты FileInfo представляют файлы на дисках файловой системы и объекты ProcessInfo представляют процессы на компьютере.
Объекты имеют свойства, которые хранят данные об объекте и методах, которые позволяют изменять объект.
Метод — это набор инструкций, указывающих действие, которое можно выполнить на объекте. Например, объект FileInfo включает метод CopyTo, копирующий файл, который представляет объект 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
Поиск используемой перегрузки
Начиная с PowerShell 7.6, можно увидеть перегрузку метода PowerShell, выбранную с помощью MethodInvocation трассировки.
В следующих примерах используется Trace-Command для отображения перегрузки, выбранной при вызове метода String.Split.
Trace-Command -PSHost -Name MethodInvocation -Expression {
"a 1 b 1 c 1 d".Split(1)
}
В первом примере целое число 1 было преобразовано в нее [char][string], что приводит к разделению [char]1 строк вместо строки "1".
DEBUG: ... MethodInvocation Information: 0 : Invoking method: string[] Spli
t(char separator, System.StringSplitOptions options = System.StringSplitOpt
ions.None)
a 1 b 1 c 1 d
Во втором примере Split() метод вызывается со строкой "1".
Trace-Command -PSHost -Name MethodInvocation -Expression {
"a 1 b 1 c 1 d".Split("1")
}
PowerShell выбрала перегрузку [string] , которая принимает разделитель.
DEBUG: ... MethodInvocation Information: 0 : Invoking method: string[] Spli
t(string separator, System.StringSplitOptions options = System.StringSplitO
ptions.None)
a
b
c
d
Использование методов .NET, которые принимают пути файловой системы
PowerShell поддерживает несколько пространств выполнения для каждого процесса. Каждое пространство выполнения имеет собственный текущий каталог. Это не так же, как рабочий каталог текущего процесса: [System.Environment]::CurrentDirectory
Методы .NET используют рабочий каталог процесса. Командлеты PowerShell используют расположение Runspace. Кроме того, методы .NET работают только с собственными путями файловой системы, а не с объектами Пути PowerShell. Чтобы использовать пути PowerShell с методами .NET, перед передачей в метод .NET необходимо разрешить путь к собственному пути файловой системы.
См. также
PowerShell