3. Conceitos básicos

3.1 Fornecedores e unidades

Um fornecedor permite o acesso a dados e componentes que de outra forma não seriam facilmente acessíveis na linha de comando. Os dados são apresentados num formato consistente que se assemelha a uma unidade do sistema de ficheiros.

Os dados que um fornecedor expõe aparecem numa unidade, e os dados são acedidos através de um caminho tal como com uma unidade de disco. Os cmdlets incorporados para cada fornecedor gerem os dados da unidade do fornecedor.

O PowerShell inclui o seguinte conjunto de fornecedores integrados para aceder aos diferentes tipos de lojas de dados:

Fornecedor Nome do disco Descrição O árbitro.
Alias Pseudónimo: Pseudónimos powerShell §3.1.1
Ambiente Env: Variáveis de ambiente §3.1.2
FileSystem A:, B:, C:, ... Discos, diretórios e ficheiros §3.1.3
Função Função: Funções PowerShell §3.1.4
Variável Variável: Variáveis PowerShell §3.1.5

Windows PowerShell:

Fornecedor Nome do disco Descrição
Certificado Cert: certificados x509 para assinaturas digitais
Registo HKLM: (HKEY_LOCAL_MACHINE), HKCU: (HKEY_CURRENT_USER) registo Windows
WSMan WSMan: informação de configuração WS-Management

Os seguintes cmdlets tratam de fornecedores e unidades:

  • Get-PSProvider: Obtém informações sobre um ou mais fornecedores
  • Get-PSDrive: Obtém informações sobre uma ou mais unidades

O tipo de objeto que representa um fornecedor é descrito em §4.5.1. O tipo de objeto que representa uma unidade é descrito em §4.5.2.

3.1.1 Pseudónimos

Um pseudónimo é um nome alternativo para um comando. Um comando pode ter vários pseudónimos, e o nome original e todos os seus pseudónimos podem ser usados intercambiavelmente. Um pseudónimo pode ser reatribuído. Um pseudónimo é um item (§3.3).

Um pseudónimo pode ser atribuído a outro pseudónimo; no entanto, o novo pseudónimo não é um pseudónimo do comando original.

O provedor Alias é um espaço de nome plano que contém apenas objetos que representam os pseudónimos. As variáveis não têm itens para crianças.

Alguns pseudónimos são construídos no PowerShell.

Os seguintes cmdlets tratam de pseudónimos:

Quando um pseudónimo é criado para um comando usando New-Alias, os parâmetros para esse comando não podem ser incluídos nesse pseudónimo. No entanto, a atribuição direta a uma variável no Alias: o espaço de nome permite que os parâmetros sejam incluídos.

Nota

É uma questão simples, no entanto, criar uma função que não faz mais do que conter a invocação desse comando com todos os parâmetros desejados, e atribuir um pseudónimo a essa função.

O tipo de objeto que representa um pseudónimo é descrito em §4.5.4.

Os objetos de pseudónimo são armazenados na unidade Alias: (§3.1).

3.1.2 Variáveis ambientais

O fornecedor de ambiente PowerShell permite que as variáveis do ambiente do sistema operativo sejam recuperadas, adicionadas, alteradas, limpas e eliminadas.

O fornecedor Ambiente é um espaço de nome plano que contém apenas objetos que representam as variáveis ambientais. As variáveis não têm itens para crianças.

O nome de uma variável ambiental não pode incluir o sinal igual (=).

As alterações nas variáveis ambientais afetam apenas a sessão atual.

Uma variável ambiental é um item (§3.3).

O tipo de objeto que representa uma variável ambiental é descrito em §4.5.6.

Os objetos variáveis do ambiente são armazenados na unidade Env: (§3.1).

3.1.3 Sistema de arquivo

O fornecedor de sistema de ficheiros PowerShell permite que diretórios e ficheiros sejam criados, abertos, alterados e eliminados.

O fornecedor de sistema de ficheiros é um espaço hierárquico que contém objetos que representam o sistema de ficheiros subjacente.

Os ficheiros são armazenados em unidades com nomes como A:, B:, C:, e assim por diante (§3.1). Os diretórios e ficheiros são acedidos através da notação do caminho (§3.4).

Um diretório ou ficheiro é um item (§3.3).

3.1.4 Funções

O provedor de função PowerShell permite que as funções (§8.10) e os filtros (§8.10.1) sejam recuperados, adicionados, alterados, limpos e eliminados.

A função do fornecedor é um espaço de nome plano que contém apenas os objetos de função e filtro. Nem as funções nem os filtros têm objetos infantis.

As alterações às funções afetam apenas a sessão atual.

Uma função é um item (§3.3).

O tipo de objeto que representa uma função é descrito em §4.5.10. O tipo de objeto que representa um filtro é descrito em §4.5.11.

Os objetos de função são armazenados na unidade Função: (§3.1).

3.1.5 Variáveis

As variáveis podem ser definidas e manipuladas diretamente na linguagem PowerShell.

O fornecedor Variable é um espaço de nome plano que contém apenas objetos que representam as variáveis. As variáveis não têm itens para crianças.

Os seguintes cmdlets também lidam com variáveis:

Como variável é um item (§3.3), pode ser manipulado pela maioria dos cmdlets relacionados com o item.

O tipo de objeto que representa uma variável é descrito em §4.5.3.

Os objetos variáveis são armazenados na unidade Variável: (§3.1).

3.2 Locais de trabalho

O local de trabalho atual é o local padrão para o ponto de comando. Esta é a localização utilizada se não for fornecida uma via explícita (§3.4) quando um comando é invocado. Este local inclui a unidade atual.

Um hospedeiro PowerShell pode ter múltiplas unidades, nesse caso, cada unidade tem a sua própria localização atual.

Quando um nome de unidade é especificado sem um diretório, a localização atual para essa unidade está implícita.

O local de trabalho atual pode ser guardado numa pilha e, em seguida, definido para um novo local. Mais tarde, essa localização guardada pode ser restaurada a partir dessa pilha e fazer o local de trabalho atual. Existem dois tipos de pilhas de localização: a pilha de localização padrão e pilhas de localização de localização definidas pelo utilizador zero ou mais. Quando uma sessão começa, a pilha de local de trabalho padrão é também a pilha de localização de trabalho atual. No entanto, qualquer stack de local de trabalho nomeado pode ser feita a pilha de localização de trabalho atual.

Os seguintes cmdlets tratam das localizações:

  • Localização de conjunto: Estabelece o local de trabalho atual
  • Localização: Determina o local de trabalho atual para as unidades especificadas ou os locais de trabalho para as pilhas especificadas ou os locais de trabalho para as pilhas especificadas ou as pilhas especificadas)
  • Localização push: Salva o local de trabalho atual no topo de uma pilha especificada de locais
  • Pop-Location: Restaura o local de trabalho atual a partir do topo de uma pilha especificada de locais

Os tipos de objetos que representam um local de trabalho e uma pilha de locais de trabalho são descritos em §4.5.5.

3.3 Itens

Um item é um pseudónimo (§3.1.1), uma variável (§3.1.5), uma função (§3.1.4), uma variável ambiental (§3.1.2), ou um ficheiro ou diretório num sistema de ficheiros (§3.1.3).

Os seguintes cmdlets tratam de itens:

Os cmdlets seguintes tratam do conteúdo dos itens:

O tipo de objeto que representa um diretório é descrito em §4.5.17. O tipo de objeto que representa um ficheiro é descrito em §4.5.18.

3.4 Nomes de caminhos

Todos os itens numa loja de dados acessíveis através de um fornecedor PowerShell podem ser identificados exclusivamente pelos seus nomes de caminhos. Um nome de caminho é uma combinação do nome do item, do recipiente e dos subcontainers em que o item está localizado, e da unidade PowerShell através da qual os recipientes são acedidos.

Os nomes do caminho são divididos em um de dois tipos: totalmente qualificados e relativos. Um nome de caminho totalmente qualificado consiste de todos os elementos que compõem um caminho. A seguinte sintaxe mostra os elementos num nome de caminho totalmente qualificado:

Dica

A ~opt~ notação nas definições de sintaxe indica que a entidade lexical é opcional na sintaxe.

path:
    provider~opt~   drive~opt~   containers~opt~   item

provider:
    module~opt~   provider   ::

module:
    module-name   \

drive:
    drive-name   :

containers:
    container   \
    containers container   \

o nome do módulo refere-se ao módulo principal.

fornecedor refere-se ao fornecedor PowerShell através do qual a loja de dados é acedida.

unidade refere-se à unidade PowerShell que é suportada por um determinado fornecedor PowerShell.

Um recipiente pode conter outros recipientes, que podem conter outros recipientes, e assim por diante, com o recipiente final a segurar um item. Os recipientes devem ser especificados na ordem hierárquica em que existem na loja de dados.

Aqui está um exemplo de um nome de caminho:

E:\Accounting\InvoiceSystem\Production\MasterAccount\MasterFile.dat

Se o elemento final de um caminho contiver outros elementos, é um elemento de contentor; caso contrário, é um elemento de folha.

Em alguns casos, não é necessário um nome de caminho totalmente qualificado; um nome relativo do caminho será suficiente. Um nome relativo do caminho baseia-se no local de trabalho atual. A PowerShell permite que um item seja identificado com base na sua localização relativamente ao local de trabalho atual. Um nome relativo do caminho envolve o uso de alguns caracteres especiais. A tabela seguinte descreve cada um destes caracteres e fornece exemplos de nomes relativos do caminho e nomes de caminhos totalmente qualificados. Os exemplos na tabela baseiam-se no atual diretório de trabalho definido para C:\Windows:

Símbolo Descrição Caminho relativo Caminho totalmente qualificado
. Local de trabalho atual .\System C:\Windows\System
.. Pai do local de trabalho atual ..\Program Files C:\Program Files
\ Raiz de unidade do local de trabalho atual \Program Files C:\Program Files
nenhum Sem personagens especiais System C:\Windows\System

Para utilizar um nome de caminho num comando, insira esse nome como um nome de caminho totalmente qualificado ou relativo.

Os seguintes cmdlets tratam de caminhos:

  • Convert-Path: Converte um caminho de um caminho PowerShell para um caminho de provedor PowerShell
  • Join-Path: Combina um caminho e um caminho infantil num único caminho
  • Caminho de resolução: Resolve os caracteres wildcard num caminho
  • Caminho dividido: Devolve a parte especificada de um caminho
  • Caminho de teste: Determina se os elementos de um caminho existem ou se um caminho está bem formado

Alguns cmdlets (como Conteúdo Adicionado e Copy-Item utilização de filtros de ficheiros. Um filtro de ficheiro é um mecanismo para especificar os critérios para selecionar a partir de um conjunto de caminhos.

O tipo de objeto que representa um caminho resolvido é descrito em §4.5.5. Os caminhos são frequentemente manipulados como cordas.

3.5 Âmbitos

3.5.1 Introdução

Um nome pode denotar uma variável, uma função, um pseudónimo, uma variável ambiental, ou uma unidade. O mesmo nome pode denotar diferentes itens em diferentes lugares de um script. Para cada item diferente que um nome denota, esse nome só é visível na região do texto do script chamado seu âmbito. Diferentes itens denotados pelo mesmo nome têm diferentes âmbitos, ou estão em diferentes espaços de nome.

Os âmbitos podem nidificar, nesse caso, um âmbito exterior é referido como um âmbito de parentalidade, e quaisquer âmbitos aninhados são âmbitos infantis desse progenitor. O âmbito de aplicação de um nome é o âmbito em que é definido e todos os âmbitos infantis, a menos que seja tornado privado. Dentro de um âmbito infantil, um nome definido aí esconde quaisquer itens definidos com o mesmo nome nos âmbitos dos pais.

A menos que a notação de origem do ponto (§3.5.5) seja utilizada, cada uma das seguintes cria um novo âmbito:

  • Um arquivo de script
  • Um bloco de scripts
  • Uma função ou filtro

Considere o exemplo seguinte:

# start of script
$x = 2; $y = 3
Get-Power $x $y

#function defined in script

function Get-Power([int]$x, [int]$y)
{
if ($y -gt 0) { return $x * (Get-Power $x (--$y)) }

else { return 1 }
}
# end of script

O âmbito das variáveis $x e $y criado no script é o corpo desse script, incluindo a função definida dentro dele. A função Get-Power define dois parâmetros com esses mesmos nomes. Como cada função tem o seu próprio âmbito, estas variáveis são diferentes das definidas no âmbito dos pais, e escondem-nas do âmbito dos pais. O âmbito de função está aninhado dentro do âmbito do script.

Note que a função se autointitula recursivamente. Cada vez que o faz, cria mais um âmbito aninhado, cada um com as suas próprias $x variáveis e $y.

Aqui está um exemplo mais complexo, que também mostra âmbitos aninhados e reutilização de nomes:

# start of script scope
$x = 2              # top-level script-scope $x created
                    # $x is 2
F1                  # create nested scope with call to function F1
                    # $x is 2
F3                  # create nested scope with call to function F3
                    # $x is 2

function F1 {       # start of function scope
                    # $x is 2
    $x = $true      # function-scope $x created
                    # $x is $true

    & {             # create nested scope with script block
                    # $x is $true
        $x = 12.345 # scriptblock-scope $x created
                    # $x is 12.345
    }               # end of scriptblock scope, local $x goes away

                    # $x is $true
    F2              # create nested scope with call to function F2
                    # $x is $true
}                   # end of function scope, local $x goes away

function F2 {       # start of function scope
                    # $x is $true
    $x = "red"      # function-scope $x created
                    # $x is "red"
}                   # end of function scope, local $x goes away

function F3 {       # start of function scope
                    # $x is 2
    if ($x -gt 0) {
                    # $x is 2
        $x = "green"
                    # $x is "green"
    }               # end of block, but not end of any scope
                    # $x is still "green"
}                   # end of function scope, local $x goes away
# end of script scope

3.5.2 Nomes e números de âmbito

A PowerShell suporta os seguintes âmbitos:

  • Global: Este é o âmbito de maior nível. Todas as variáveis automáticas e preferenciais são definidas neste âmbito. O âmbito global é o âmbito-mãe de todos os outros âmbitos, e todos os outros âmbitos são âmbitos infantis do âmbito global.

  • Local: Este é o âmbito atual em qualquer ponto de execução dentro de um script, bloco de script ou função. Qualquer âmbito pode ser o âmbito local.

  • Script: Este âmbito existe para cada ficheiro de script que é executado. O âmbito do script é o âmbito principal de todos os âmbitos criados a partir dele. Um bloco de scripts não tem o seu próprio âmbito de script; em vez disso, o seu âmbito de script é o do seu ficheiro de script ancestral mais próximo. Embora não exista tal coisa como o âmbito do módulo, o âmbito do script fornece o equivalente.

Os nomes podem ser declarados privados, caso em que não são visíveis fora do âmbito dos pais, nem mesmo para os âmbitos infantis. O conceito de privado não é um âmbito distinto; é um pseudónimo para o âmbito local com a adição de esconder o nome se usado como um local writable.

Os âmbitos podem ser referidos por um número, que descreve a posição relativa de um âmbito para outro. O âmbito 0 denota o âmbito local, o âmbito 1 denota um âmbito ancestral de 1 geração, o âmbito 2 denota um âmbito ancestral de 2 gerações, e assim por diante. (Os números de âmbito são utilizados por cmdlets que manipulam variáveis.)

3.5.3 Âmbito de nome variável

Como mostrado pela seguinte produção, um nome variável pode ser especificado com qualquer um dos seis âmbitos diferentes:

variable-scope:
    global:
    local:
    private:
    script:
    using:
    workflow:
    variable-namespace

O âmbito é opcional. A tabela a seguir mostra o significado de cada um em todos os contextos possíveis. Também mostra o âmbito quando não é especificado nenhum âmbito explicitamente:

Modificador de âmbito Dentro de um ficheiro de script Dentro de um bloco de script Dentro de uma Função
global Âmbito global Âmbito global Âmbito global
script O âmbito do ficheiro de script do ancestral mais próximo ou global se não houver um ficheiro de script ancestral mais próximo O âmbito do ficheiro de script do ancestral mais próximo ou global se não houver um ficheiro de script ancestral mais próximo O âmbito do ficheiro de script do ancestral mais próximo ou global se não houver um ficheiro de script ancestral mais próximo
privado Âmbito global/script/local Âmbito local Âmbito local
local Âmbito global/script/local Âmbito local Âmbito local
a utilizar Implementação definida Implementação definida Implementação definida
fluxo de trabalho Implementação definida Implementação definida Implementação definida
nenhum Âmbito global/script/local Âmbito local Âmbito local

As informações de âmbito variável também podem ser especificadas quando se utiliza a família dos cmdlets listados em (§3.1.5). Em particular, consulte o parâmetro Scope, os parâmetros Option Private e Option AllScope para mais informações.

O âmbito using é utilizado para aceder a variáveis definidas noutro âmbito enquanto executa scripts através de cmdlets como Start-Job, Invoke-Commandou dentro de uma declaração de inscrição. Por exemplo:

$a = 42
Invoke-Command --ComputerName RemoteServer { $using:a } # returns 42
workflow foo
{
    $b = "Hello"
    inlinescript { $using:b }
}
foo # returns "Hello"

O fluxo de trabalho do âmbito é utilizado com uma declaração paralela ou uma declaração de sequência para aceder a uma variável definida no fluxo de trabalho.

3.5.4 Âmbito de nome de função

Um nome de função também pode ter um dos quatro âmbitos diferentes, e a visibilidade desse nome é a mesma que para variáveis (§3.5.3).

3.5.5 Notação de fonte de ponto

Quando um ficheiro de script, bloco de script ou função é executado a partir de outro ficheiro de script, bloco de script ou função, o ficheiro de script executado cria um novo âmbito aninhado. Por exemplo,

Script1.ps1
& "Script1.ps1"
& { ... }
FunctionA

No entanto, quando a notação de fonte de ponto é utilizada, não é criado nenhum novo âmbito antes de o comando ser executado, pelo que as adições/alterações que teria feito ao seu próprio âmbito local são feitas ao âmbito atual. Por exemplo,

. Script2.ps1
. "Script2.ps1"
. { ... }
. FunctionA

3.5.6 Módulos

Assim como um ficheiro de script de alto nível está na raiz de uma árvore de âmbito hierárquica aninhada, assim como cada módulo (§3.14). No entanto, por padrão, apenas os nomes exportados por um módulo estão disponíveis pelo nome a partir do contexto de importação. O parâmetro global do cmdlet Import-Module permite que os nomes exportados tenham uma maior visibilidade.

3.6 Propriedades ReadOnly e Constant

Variáveis e pseudónimos são descritos por objetos que contêm uma série de propriedades. Estas propriedades são definidas e manipuladas por duas famílias de cmdlets (§3.1.5, §3.1.1). Uma dessas propriedades são opções, que podem ser definidas para ReadOnly ou Constant (usando o parâmetro Opção). Uma variável ou pseudónimo marcado ReadOnly pode ser removida, e as suas propriedades podem ser alteradas desde que o parâmetro Force seja especificado. No entanto, uma variável ou pseudónimo marcado constante não pode ser removida nem alterada as suas propriedades.

3.7 Sobrecargas de métodos e resolução de chamadas

3.7.1 Introdução

Como indicado no §1, um procedimento externo disponibilizado pelo ambiente de execução (e escrito em alguma língua que não o PowerShell) é chamado de método.

O nome de um método juntamente com o número e os tipos dos seus parâmetros são colectivamente chamados de assinatura desse método. (Note que a assinatura não inclui o tipo de devolução do método.) O ambiente de execução pode permitir que um tipo tenha múltiplos métodos com o mesmo nome desde que cada um tenha uma assinatura diferente. Quando várias versões de algum método são definidas, este método é dito estar sobrecarregado. Por exemplo, o tipo de Matemática (§4.3.8) contém um conjunto de métodos chamados Abs, que calcula o valor absoluto de um número especificado, onde o número especificado pode ter um de vários tipos. Os métodos nesse conjunto têm as seguintes assinaturas:

Abs(decimal)
Abs(float)
Abs(double)
Abs(int)
Abs(long)
Abs(SByte)
Abs(Int16)

Neste caso, todos os métodos têm o mesmo número de argumentos; as suas assinaturas diferem apenas pelo tipo de argumento.

Outro exemplo envolve o tipo Matriz (§4.3.2), que contém um conjunto de métodos chamados Copy que copia uma gama de elementos de uma matriz para outra, começando no início de cada matriz (por padrão) ou em algum elemento designado. Os métodos nesse conjunto têm as seguintes assinaturas:

Copy(Array, Array, int)
Copy(Array, Array, long)
Copy(Array, int, Array, int, int)
Copy(Array, long, Array, long, long)

Neste caso, as assinaturas diferem por tipo de argumento e, em alguns casos, também pelo número de argumentos.

Na maioria das chamadas para métodos sobrecarregados, o número e o tipo dos argumentos passaram exatamente correspondendo a uma das sobrecargas, e o método selecionado é óbvio. No entanto, se não for esse o caso, tem de haver uma forma de resolver qual a versão sobrecarregada a ligar, se houver. Por exemplo,

[Math]::Abs([byte]10) # no overload takes type byte
[Array]::Copy($source, 3, $dest, 5L, 4) # both int and long indexes

Outros exemplos incluem a cadeia tipo (ou seja, System.String), que tem inúmeros métodos sobrecarregados.

Embora o PowerShell tenha regras para resolver chamadas de métodos que não correspondam exatamente a uma assinatura sobrecarregada, a PowerShell não fornece por si só uma forma de definir métodos sobrecarregados.

Nota

Nota do editor: PowerShell 5.0 acrescentou a capacidade de definir aulas baseadas em scripts. Estas aulas podem conter métodos sobrecarregados.

3.7.2 Resolução de sobrecarga de método

Dada a chamada de método (§7.1.3) com uma lista de expressões de argumentos, e um conjunto de métodos candidatos (isto é, os métodos que poderiam ser chamados), o mecanismo para selecionar o melhor método é chamado de resolução de sobrecarga.

Dado o conjunto de métodos de candidatos aplicáveis (§3.7.3), é selecionado o melhor método nesse conjunto. Se o conjunto contiver apenas um método, então este método é o melhor método. Caso contrário, o melhor método é o método melhor do que todos os outros métodos no que diz respeito à lista de argumentos dadas, utilizando as regras indicada no §3.7.4. Se não existe exatamente um método que seja melhor do que todos os outros métodos, então a invocação do método é ambígua e um erro é relatado.

O melhor método deve ser acessível no contexto em que é chamado. Por exemplo, um script PowerShell não pode chamar um método privado ou protegido.

O melhor método para uma chamada a um método estático deve ser um método estático, e o melhor método para uma chamada a um método de instância deve ser um método de instância.

3.7.3 Método aplicável

Diz-se que um método é aplicável no que diz respeito a uma lista de argumentos A quando uma das seguintes é verdadeira:

  • O número de argumentos em A é idêntico ao número de parâmetros que o método aceita.
  • O método tem parâmetros necessários M e parâmetros opcionais N, e o número de argumentos em A é maior ou igual a M, mas menos que N.
  • O método aceita um número variável de argumentos e o número de argumentos em A é maior do que o número de parâmetros que o método aceita.

Além de ter um número adequado de argumentos, cada argumento em A deve corresponder ao modo de passagem de parâmetros do argumento, e o tipo de argumento deve corresponder ao tipo de parâmetro, ou deve haver uma conversão do tipo de argumento para o tipo de parâmetro.

Se o tipo de argumento for ref (§4.3.6), o parâmetro correspondente também deve ser árbitro, e o tipo de argumento para efeitos de conversão é o tipo de valor da propriedade a partir do argumento do árbitro.

Se o tipo de argumento for ref, o parâmetro correspondente pode ser out em vez de ref.

Se o método aceitar um número variável de argumentos, o método pode ser aplicável de forma normal ou expandida. Se o número de argumentos em A for idêntico ao número de parâmetros que o método aceita e o último parâmetro é uma matriz, então a forma depende da classificação de uma de duas conversões possíveis:

  • A classificação da conversão do tipo do último argumento em A para o tipo de matriz para o último parâmetro.
  • A classificação da conversão do tipo do último argumento em A para o tipo de elemento do tipo de matriz para o último parâmetro.

Se a primeira conversão (para o tipo de matriz) for melhor do que a segunda conversão (para o tipo de elemento da matriz), então o método é aplicável na forma normal, caso contrário é aplicável na forma expandida.

Se houver mais argumentos do que parâmetros, o método pode ser aplicável apenas na forma expandida. Para ser aplicável na forma expandida, o último parâmetro deve ter o tipo de matriz. O método é substituído por um método equivalente que tem o último parâmetro substituído por parâmetros suficientes para explicar cada argumento incomparável em A. Cada tipo de parâmetro adicional é o tipo de elemento do tipo de matriz para o último parâmetro no método original. As regras acima referidas para um método aplicável são aplicadas a este novo método e lista de argumentos A.

3.7.4 Melhor método

Dada a lista de argumentos A com um conjunto de expressões de argumentos e dois métodos { E~1~, E~2~, ..., E~N~ } M~P~ de aplicação e M~Q~ com tipos de parâmetros { P~1~, P~2~, ..., P~N~ } e { Q~1~, Q~2~, ..., Q~N~ }, M~P~ é definido como um método melhor do que M~Q~ se o ranking cumulativo de conversões for M~P~ melhor do que aquele para M~Q~.

O ranking cumulativo das conversões é calculado da seguinte forma. Cada conversão vale um valor diferente dependendo do número de parâmetros, com a conversão do E~1~ valor N, E~2~ no valor de N-1, até valer E~N~ 1. Se a conversão de E~X~ um para o P~X~ outro for melhor do que a de E~X~ , Q~X~o M~P~ acumulado N-X+1; caso contrário, M~Q~ acumula N-X+1. Se M~P~ e M~Q~ tiver o mesmo valor, então são utilizadas as seguintes regras de rutura de gravata, aplicadas por ordem:

  • O ranking cumulativo de conversões entre tipos de parâmetros (ignorando tipos de argumentos) é calculado de uma forma semelhante à classificação anterior, pelo P~1~ que é comparado contra Q~1~, P~2~ contra Q~2~, ..., e P~N~ contra Q~N~. A comparação é ignorada se o argumento foi $null, ou se os tipos de parâmetros não são tipos numéricos. A comparação também é ignorada se a conversão E~X~ de argumentos perder informação quando convertida P~X~ , mas não perde informação quando convertida para Q~X~, ou vice-versa. Se os tipos de conversão de parâmetros forem comparados, então se a conversão de P~X~ para ser Q~X~ melhor do que a P~X~deQ~X~, o M~P~ acumulado N-X+1; caso contrário, M~Q~ acumula N-X+1. Esta regra de rutura de gravata destina-se a preferir o método mais específico (isto é, o método com parâmetros com os mais pequenos tipos de dados) se não se perder informação nas conversões, ou preferir o método mais geral (ou seja, o método com os parâmetros com os maiores tipos de dados) se as conversões resultarem em perda de informação.
  • Se ambos os métodos usam a sua forma expandida, o método com mais parâmetros é o melhor método.
  • Se um método utilizar a forma expandida e o outro utilizar a forma normal, o método utilizando a forma normal é o melhor método.

3.7.5 Melhor conversão

O texto abaixo marcado como este é específico para Windows PowerShell.

As conversões são classificadas da seguinte forma, da mais baixa para a mais alta:

  • T~1~[] a T~2~[] onde não há conversão atribuível entre T~1~ e T~2~ existe
  • T para corda onde T é qualquer tipo
  • T~1~ para T~2~ onde T~1~ ou T~2~ definir uma conversão personalizada de uma forma definida pela implementação
  • T~1~ para T~2~ onde T~1~ implementa iConvertível
  • T~1~ para T~2~ onde T~1~ ou T~2~ implementar o método T~2~ op_Implicit(T1)
  • T~1~ para T~2~ onde T~1~ ou T~2~ implementar o método T~2~ op_Explicit(T1)
  • T~1~ para T~2~ onde T~2~ implementa um construtor tendo um único argumento de tipo T~1~
  • Uma das seguintes conversões:
    • cadeia para T onde T implementa um método T Parse(string) estático ou T Parse(string, IFormatProvider)
    • T~1~ para T~2~ onde T~2~ está qualquer enum e T~1~ é ou string ou uma coleção de objetos que podem ser convertidos em corda
  • T para PSObject onde T é qualquer tipo
  • Qualquer uma das seguintes conversões: Language
    • T para bool onde T está qualquer tipo numérico
    • corda para T onde T estáregex, wmisearcher``wmi, wmiclass, adsi, , adsisearcher, outype
    • T Para bool
    • T~1~ para Nullable[T~2~] onde existe uma conversão de T~1~ para T~2~
    • T para anular
    • T~1~[] a T~2~[] quando uma conversão atribuível entre T~1~ e T~2~ existe
    • T~1~ para T~2~[] onde T~1~ é uma coleção
    • IDictionary Para Hashtable
    • T Para ref
    • T Para xml
    • scriptblock Para delegate
    • T~1~ para T~2~ onde T~1~ é um tipo inteiro e T~2~ é um enum
  • $null para T onde T é qualquer tipo de valor
  • $null para T onde T está qualquer tipo de referência
  • Qualquer uma das seguintes conversões:
    • byte para T onde T está SByte

    • UInt16 para T onde T está SByte, byteou Int16

    • Int16 para T onde T está SByte ou byte

    • UInt32onde T estáSByte, byte, Int16, UInt16ou T``int

    • intpara T onde T estáSByte, byte``Int16ouUInt16

    • UInt64onde T estáSByte, byte, Int16, UInt16, int, , UInt32ou T``long

    • longonde T estáSByte, byte, Int16, UInt16, intou T``UInt32

    • float para T onde T está qualquer tipo inteiro ou decimal

    • double para T onde T está qualquer tipo inteiro ou decimal

    • decimal para T onde T está qualquer tipo inteiro

  • Qualquer uma das seguintes conversões:
    • SBytepara T onde T estábyte, uint6``UInt32ouUInt64
    • Int16 para T onde T está UInt16, UInt32ou UInt64
    • int para T onde T está UInt32 ou UInt64
    • long Para UInt64
    • decimal para T onde T está float ou double
  • Qualquer uma das seguintes conversões:
    • T para string onde T está qualquer tipo numérico
    • T para char onde T está qualquer tipo numérico
    • string para T onde T está qualquer tipo numérico
  • Qualquer uma das seguintes conversões, estas conversões são consideradas conversões atribuíveis:
    • byte``T onde T estáInt16, UInt16, int``UInt32, long, , UInt64, single, double, , oudecimal
    • SByte``T onde T estáInt16, UInt16, int``UInt32, long, , UInt64, single, double, , oudecimal
    • UInt16a T onde T estáint, UInt32``longouUInt64, single, double, oudecimal
    • Int16a T onde T estáint, UInt32``longouUInt64, single, double, oudecimal
    • UInt32 para T onde T está long, ou UInt64, single, doubleou decimal
    • intonde T estálong, UInt64, single, doubleou T``decimal
    • single Para double
  • T~1~ para T~2~ onde T~2~ é uma classe base ou interface de T~1~. Esta conversão é considerada uma conversão atribuível.
  • string Para char[]
  • T a T - Esta conversão é considerada uma conversão atribuível.

Para cada conversão do formulário para onde não é um array e nenhuma outra conversão se aplica, se houver uma conversão de T~1~ para T~2~, o grau de conversão é pior do que a conversão de T~2~``T~1~ , mas melhor do que qualquer conversão classificada menos do que a conversão de T~1~ para ,T~1~ T~2~[] T~1~``T~2~

3.8 Procura de nome

É possível ter comandos de diferentes tipos todos com o mesmo nome. A ordem em que o nome de procura é realizado em tal caso é pseudónimo, função, cmdlet e comando externo.

3.9 Tipo de procura

§7.1.10 contém a afirmação: "Um tipo-literal é representado numa implementação por algum tipo subjacente não especificado. Como resultado, um nome tipo é um sinónimo para o seu tipo subjacente." Exemplos de tipos sãoint, doubleelong[]``Hashtable.

Os nomes do tipo são combinados da seguinte forma: Compare um nome de tipo dado com a lista de aceleradores do tipo incorporado, tais como int, longo, duplo. Se for encontrado um fósforo, este é o tipo. Caso contrário, presuma que o nome do tipo está totalmente qualificado e ver se existe tal tipo no sistema de hospedeiro. Se for encontrado um fósforo, este é o tipo. Caso contrário, adicione o prefixo do espaço de System.nome. Se for encontrado um fósforo, este é o tipo. Caso contrário, o tipo de nome está errado. Este algoritmo é aplicado para cada argumento de tipo para tipos genéricos. No entanto, não há necessidade de especificar a aridade (número de argumentos ou operatórios tomados por uma função ou operador).

3.10 Gestão automática da memória

Vários operadores e cmdlets resultam na atribuição de memória para objetos do tipo de referência, tais como cordas e matrizes. A atribuição e libertação desta memória é gerida pelo sistema de tempo de execução PowerShell. Ou seja, a PowerShell fornece recolha automática de lixo.

3.11 Ordem de execução

Um efeito colateral é uma mudança no estado do ambiente de execução de um comando. Uma alteração ao valor de uma variável (através dos operadores de atribuição ou dos operadores pré-incrementos e decrementos) é um efeito colateral, assim como uma alteração ao conteúdo de um ficheiro.

Salvo especificação em contrário, as declarações são executadas por ordem lexical.

Salvo especificação para alguns operadores, a ordem de avaliação dos termos numa expressão e a ordem em que os efeitos secundários ocorrem não são ambas não especificadas.

Uma expressão que invoca um comando envolve a expressão que designa o comando, e zero ou mais expressões que designam os argumentos cujos valores devem ser passados a esse comando. A ordem pela qual estas expressões são avaliadas em relação umas às outras não é especificada.

3.12 Tratamento de erros

Quando um comando falha, este é considerado um erro, e as informações sobre esse erro são registadas num registo de erro, cujo tipo não é especificado (§4.5.15); no entanto, este tipo suporta a subscrição.

Um erro cai numa de duas categorias. Ou termina a operação (um erro de terminação) ou não (um erro de não rescisão). Com um erro de terminação, o erro é registado e a operação para. Com um erro de não rescisão, o erro é registado e a operação continua.

Erros de não rescisão são escritos no fluxo de erros. Embora essa informação possa ser redirecionada para um ficheiro, os objetos de erro são primeiro convertidos em cordas e informações importantes nesses objetos não seriam capturadas tornando o diagnóstico difícil, se não impossível. Em vez disso, o texto de erro pode ser redirecionado (§7.12) e o objeto de erro guardado numa variável, como em $Error1 = command 2>&1.

A variável $Error automática contém uma coleção de registos de erros que representam erros recentes, e o erro mais recente está em $Error[0]. Esta coleção é mantida num tampão de tal forma que os registos antigos são descartados à medida que os novos são adicionados. A variável $MaximumErrorCount automática controla o número de registos que podem ser armazenados.

$Error contém todos os erros de todos os comandos misturados numa única coleção. Para recolher os erros de um comando específico, utilize o parâmetro comum ErrorVariable, que permite especificar uma variável definida pelo utilizador para manter a coleção.

3.13 Gasodutos

Um gasoduto é uma série de um ou mais comandos cada um separado pelo operador | do tubo (U+007C). Cada comando recebe a entrada do seu antecessor e escreve a saída para o seu sucessor. A menos que a saída no final do oleoduto seja descartada ou redirecionada para um ficheiro, é enviada para o ambiente de anfitrião, que pode optar por escrevê-la para a saída padrão. Os comandos num oleoduto também podem receber entradas de argumentos. Por exemplo, considere a seguinte utilização de comandos , Sort-Objecte Process-File, que criam uma lista de nomes de ficheiros Get-ChildItemnum dado diretório do sistema de ficheiros, classificam um conjunto de registos de texto e realizam algum processamento num registo de texto, respectivamente:

Get-ChildItem
Get-ChildItem e:*.txt | Sort-Object -CaseSensitive | Process-File >results.txt

No primeiro caso, Get-ChildItem cria uma coleção de nomes dos ficheiros no diretório atual/predefinido. Esta coleção é enviada para o ambiente de acolhimento, que, por defeito, escreve o valor de cada elemento para a saída padrão.

No segundo caso, Get-ChildItem cria-se uma coleção de nomes dos ficheiros no diretório especificado, utilizando o argumento e:*.txt. Esta coleção é escrita ao comando Sort-Object, que, por defeito, os classifica por ordem ascendente, sensível ao caso (em virtude do argumento do CasoSensitivo ). A recolha resultante é então escrita para comando Process-File, que executa algum processamento (desconhecido). A saída desse comando é então redirecionada para o ficheiro results.txt.

Se um comando escrever um único objeto, o seu sucessor recebe esse objeto e termina depois de escrever o seu próprio objeto ao seu sucessor. Se, no entanto, um comando escrever vários objetos, são entregues um de cada vez ao comando sucessor, que executa uma vez por objeto. Este comportamento chama-se streaming. No processamento de fluxo, os objetos são escritos ao longo do oleoduto assim que ficam disponíveis, não quando toda a coleção foi produzida.

Ao processar uma coleção, pode ser escrito um comando de modo a que possa fazer um processamento especial antes do elemento inicial e depois do elemento final.

3.14 Módulos

Um módulo é uma unidade reutilizável autossuficiente que permite que o código PowerShell seja dividido, organizado e abstraído. Um módulo pode conter comandos (como cmdlets e funções) e itens (tais como variáveis e pseudónimos) que podem ser usados como uma única unidade.

Uma vez criado um módulo, deve ser importado para uma sessão antes de os comandos e itens dentro dele poderem ser utilizados. Uma vez importados, os comandos e os itens comportam-se como se fossem definidos localmente. Um módulo é importado explicitamente com o Import-Module comando. Um módulo também pode ser importado automaticamente, conforme determinado de forma definida na implementação.

O tipo de objeto que representa um módulo é descrito em §4.5.12.

Os módulos são discutidos em detalhe no §11.

3.15 Expressões wildcard

Uma expressão wildcard pode conter zero ou mais dos seguintes elementos:

Elemento Descrição
Personagem que não *, ?, ou [ Corresponde a um personagem
* Corresponde a zero ou mais caracteres. Para combinar com um personagem *, use [*].
? Corresponde a qualquer personagem. Para combinar com um? caráter, usar [?].
[conjunto]

Corresponde a qualquer personagem do conjunto, que não pode estar vazio.

Se o conjunto começar com ], esse suporte quadrado direito é considerado parte do conjunto e o próximo suporte quadrado direito termina o conjunto; caso contrário, o primeiro suporte quadrado direito termina o conjunto.

Se o conjunto começar ou terminar com -, esse hífen-menos é considerado parte do conjunto; caso contrário, indica uma gama de pontos de código Unicode consecutivos com os caracteres de ambos os lados do hífen-menos sendo os delimiters de alcance inclusivo. Por exemplo, A-Z indica as 26 letras maiúsculas em inglês, e 0-9 indica os 10 dígitos decimais.

Nota

Mais informações podem ser encontradas, As Especificações de Base do Grupo Aberto: Correspondência de padrões", IEEE Std 1003.1, 2004 Edition.. No entanto, em PowerShell, o personagem de fuga é retroscalço, não retrocesso.

3.16 Expressões regulares

Uma expressão regular pode conter zero ou mais dos seguintes elementos:

Elemento Descrição
Personagem que não ., ^, *, $, ou \ Corresponde a um personagem
. Corresponde a qualquer personagem. Para combinar com um . carácter, uso \..
[conjunto]
[^set]

A forma [conjunto] corresponde a qualquer personagem do conjunto. O formulário [^set] não corresponde a caracteres do conjunto. definido não pode ser vazio.

Se o conjunto começar com ] ou ^], esse suporte quadrado direito é considerado parte do conjunto e o próximo suporte quadrado direito termina o conjunto; caso contrário, o primeiro suporte quadrado direito termina o conjunto.

Se o conjunto começar com - ou ^-, ou termina com - esse hífen-menos é considerado parte do conjunto; caso contrário, indica uma gama de pontos de código Unicode consecutivos com os caracteres de ambos os lados do hífen-menos sendo os delimiters de alcance inclusivo. Por exemplo, A-Z indica as 26 letras maiúsculas em inglês, e 0-9 indica os 10 dígitos decimais.

* Corresponde a zero de mais ocorrências do elemento anterior.
+ Corresponde a mais ocorrências do elemento anterior.
? Corresponde a zero de uma ocorrência do elemento anterior.
^ Fósforos no início da corda. Para combinar com um personagem ^, use \^.
$ Combina no fim da corda. Para combinar com um personagem de $1$, use $.
\c Escapa ao personagem C, por isso não é reconhecido como um elemento de expressão regular.

Windows PowerShell: As classes de caracteres disponíveis na Microsoft .NET Framework expressões regulares são suportadas, da seguinte forma:

Elemento Descrição
\p{name} Corresponde a qualquer personagem da classe de caracteres nomeada especificada pelo nome. Os nomes suportados são grupos Unicode e gamas de blocos tais como Ll, Nd, Z, IsGreek e IsBoxDrawing.
\P{name} Corresponde o texto não incluído nos grupos e intervalos de blocos especificados no nome.
\w Corresponde a qualquer personagem de palavra. Equivalente às categorias [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]de caracteres Unicode. Se o comportamento em conformidade com o ECMAScript for especificado com a opção ECMAScript, \w é equivalente a [a-zA-Z_0-9].
\W Corresponde a qualquer personagem não-palavra. Equivalente às categorias [\^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]Unicode.
\s Corresponde a qualquer personagem do espaço branco. Equivalente às categorias [\f\n\r\t\v\x85\p{Z}] de caracteres Unicode.
\S Combina com qualquer personagem não-branco-espaço. Equivalente às categorias [\^\f\n\r\t\v\x85\p{Z}]de caracteres Unicode.
\d Corresponde a qualquer dígito decimal. Equivalente a \p{Nd} Unicode e [0-9] comportamento não-Unicode.
\D Corresponde a qualquer não-dígito. Equivalente a \P{Nd} Unicode e [\^0-9] comportamento não-Unicode.

Os quantificadores disponíveis na Microsoft .NET Framework expressões regulares são suportadas, da seguinte forma:

Elemento Descrição
* Especifica zero ou mais fósforos; por exemplo, \w* ou (abc)*. Equivalente a {0,}.
+ Corresponde a repetir instâncias dos caracteres anteriores.
? Especifica zero ou um fósforo; por exemplo, \w? ou (abc)?. . Equivalente a {0,1}.
{n} Especifica exatamente n fósforos; por exemplo, (pizza){2}. .
{n,} Especifica pelo menos n fósforos; por exemplo, (abc){2,}. .
{n,m} Especifica pelo menos n, mas não mais do que m, fósforos.