about_Methods
Descrição breve
Descreve como usar métodos para executar ações em objetos no PowerShell.
Descrição longa
O PowerShell usa objetos para representar os itens em armazenamentos de dados ou o estado do computador. Por exemplo, objetos FileInfo representam os arquivos em unidades do sistema de arquivos e objetos ProcessInfo representam os processos no computador.
Os objetos têm propriedades, que armazenam dados sobre o objeto e métodos que permitem alterar o objeto.
Um "método" é um conjunto de instruções que especificam uma ação que você pode executar no objeto . Por exemplo, o FileInfo
objeto inclui o CopyTo
método que copia o arquivo que o FileInfo
objeto representa.
Para obter os métodos de qualquer objeto, use o Get-Member
cmdlet . Use sua propriedade MemberType com um valor de "Method". O comando a seguir obtém os métodos de objetos de processo.
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...
Para executar ou "invocar" um método de um objeto, digite um ponto (.), o nome do método e um conjunto de parênteses "()". Se o método tiver argumentos, coloque os valores de argumento dentro dos parênteses. Os parênteses são necessários para cada chamada de método, mesmo quando não há argumentos. Se o método usar vários argumentos, eles deverão ser separados por vírgulas.
Por exemplo, o comando a seguir invoca o método Kill de processos para encerrar o processo do Bloco de Notas no computador.
$notepad = Get-Process notepad
$notepad.Kill()
Este exemplo pode ser reduzido combinando as instruções acima.
(Get-Process Notepad).Kill()
O Get-Process
comando é colocado entre parênteses para garantir que ele seja executado antes que o método Kill seja invocado. Em Kill
seguida, o método é invocado no objeto retornado Process
.
Outro método muito útil é o Replace
método de cadeias de caracteres. O Replace
método substitui o texto dentro de uma cadeia de caracteres. No exemplo a seguir, o ponto (.) pode ser colocado imediatamente após a aspa final da cadeia de caracteres.
'this is rocket science'.Replace('rocket', 'rock')
this is rock science
Conforme mostrado nos exemplos anteriores, você pode invocar um método em um objeto obtido usando um comando, um objeto em uma variável ou qualquer coisa que resulte em um objeto (como uma cadeia de caracteres entre aspas).
A partir do PowerShell 4.0, há suporte para invocação de método usando nomes de método dinâmico.
Aprendendo sobre métodos
Para localizar definições dos métodos de um objeto, acesse o tópico de ajuda para o tipo de objeto e procure a página de métodos. Por exemplo, a página a seguir descreve os métodos dos objetos de processo System.Diagnostics.Process.
Para determinar os argumentos de um método, examine a definição do método, que é como o diagrama de sintaxe de um cmdlet do PowerShell.
Uma definição de método pode ter uma ou mais assinaturas de método, que são como os conjuntos de parâmetros de cmdlets do PowerShell. As assinaturas mostram todos os formatos válidos de comandos para invocar o método .
Por exemplo, o CopyTo
método da FileInfo
classe contém as duas assinaturas de método a seguir:
CopyTo(String destFileName)
CopyTo(String destFileName, Boolean overwrite)
A primeira assinatura de método usa o nome do arquivo de destino (e um caminho). O exemplo a seguir usa o primeiro CopyTo
método para copiar o Final.txt
arquivo para o C:\Bin
diretório .
(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt")
Observação
Ao contrário do modo de argumento do PowerShell, os métodos de objeto são executados no modo de expressão , que é uma passagem para a estrutura do .NET na qual o PowerShell é criado. No modo de expressão , argumentos bareword (cadeias de caracteres sem aspas) não são permitidos. Você pode ver essa diferença ao usar o caminho como um parâmetro, em comparação com o caminho como um argumento. Você pode ler mais sobre modos de análise no about_Parsing
A segunda assinatura de método usa um nome de arquivo de destino e um valor booliano que determina se o arquivo de destino deve ser substituído, se ele já existir.
O exemplo a seguir usa o segundo CopyTo
método para copiar o Final.txt
arquivo para o C:\Bin
diretório e substituir arquivos existentes.
(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt", $true)
Enumeração de acesso a membro
A partir do PowerShell 3.0, quando você usa o operador de acesso a membros (.
) para acessar um método que não existe em uma coleção de listas, o PowerShell enumera automaticamente os itens na coleção e invoca o método em cada item. Para obter mais informações, consulte about_Member-Access_Enumeration.
Exemplos
O exemplo a seguir executa o método Kill de objetos de processo individuais em uma coleção de objetos .
O primeiro comando inicia três instâncias do processo do Bloco de Notas. Get-Process
obtém todas as três instâncias do processo do Bloco de Notas e salva-as na $p
variável .
Notepad; Notepad; Notepad
$p = Get-Process Notepad
$p.Count
3
O próximo comando executa o método Kill em todos os três processos na $p
variável . Esse comando funciona mesmo que uma coleção de processos não tenha um Kill
método .
$p.Kill()
Get-Process Notepad
O Get-Process
comando confirma que o Kill
método funcionou.
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
Este exemplo é funcionalmente equivalente ao uso do Foreach-Object
cmdlet para executar o método em cada objeto na coleção.
$p | ForEach-Object {$_.Kill()}
Métodos ForEach e Where
A partir do PowerShell 4.0, há suporte para filtragem de coleção usando uma sintaxe de método. Isso permite o uso de dois novos métodos ao lidar com coleções ForEach
e Where
.
Leia mais sobre esses métodos em about_arrays
Chamar um método específico quando houver várias sobrecargas
Considere o cenário a seguir ao chamar métodos .NET. Se um método usa um objeto, mas tem uma sobrecarga por meio de uma interface que usa um tipo mais específico, o PowerShell escolhe o método que aceita o objeto, a menos que você o converta explicitamente nessa interface.
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}";
}
}
'@
Neste exemplo, a sobrecarga menos específica object
do método Bar foi escolhida.
[Foo]::new().Bar(1)
object: 1
Neste exemplo, convertemos o método no IFoo da interface para selecionar a sobrecarga mais específica do método Bar .
([IFoo] [Foo]::new()).Bar(1)
int: 1
Usando métodos .NET que usam caminhos de sistema de arquivos
O PowerShell dá suporte a vários runspaces por processo. Cada runspace tem seu próprio diretório atual. Isso não é o mesmo que o diretório de trabalho do processo atual: [System.Environment]::CurrentDirectory
.
Os métodos .NET usam o diretório de trabalho do processo. Os cmdlets do PowerShell usam o local do Runspace. Além disso, os métodos .NET funcionam apenas com caminhos de sistema de arquivos nativos, não objetos Demarcador do PowerShell. Para usar caminhos do PowerShell com métodos .NET, você deve resolve o caminho para um caminho nativo do sistema de arquivos antes de passá-lo para o método .NET.