por que é errado chamar funções com parênteses em Powershell?

4

Esta questão é um desdobramento de um comentário em outra pergunta O Powershell não consegue recuperar o pwdLastSet do Active Directory

Aqui é onde eu tentei chamar a função assim:

 Get-PwdLastSet('grz')

Recebi a seguinte dica que realmente aprecio:

...first, don't use parentheses ( ) to call functions in PowerShell (it is valid syntactically but wrong semantically). The proper way to execute the function is just Get-PwdLastSet grz...

Eu entendi. Mas eu gostaria de perguntar - por que isso? O que os parênteses significam então?

    
por GrzegorzOledzki 09.12.2016 / 11:28

1 resposta

5

O Powershell é uma linguagem analisada e interpretada. O intérprete vê os parênteses como uma estrutura de controle e não é esperado ou exigido no < href="https://en.wikipedia.org/wiki/Call_site"> Site de Chamada . Considere a seguinte função de exemplo:

function test-function {

    param
    (
    [string]
    $string,

    [string]
    $word
    )

    "String: $string.  Word: $word"

}

A maneira correta de chamar essa função é a seguinte:

Test-Function -String "Hello" -Word "World"

Os criadores do Powershell na Microsoft queriam criar um novo produto único que substituísse o shell do cmd e o vbscript. Um dos principais objetivos do Powershell era padronizar a nomenclatura do cmdlet, o procedimento de chamada do site, a troca de nomes e a saída (como um objeto). Curiosamente, outro foco primário foi eliminar as falhas de segurança do vbscript.

Por padrão, os cmdlets do Powershell são Sobrecarregados para que a mesma função de exemplo possa ser chamada assim:

Test-Function "Hello" "World"

Ambos os exemplos produzirão o seguinte:

"String: Hello.  Word: World"

Então, o que acontece se decidirmos usar parênteses no site da chamada?

Test-Function("Hello","World")

"String: Hello World.  Word:"

Então o que aconteceu? Powershell interpretou nossa entrada como um único array contendo duas strings que foram passadas para a primeira variável (posicionalmente). Para obter o resultado desejado usando parênteses, você teria que fazer isso:

Test-Function("Hello")("World")

Estamos enviando duas estruturas controladas (por tipo de objeto think da estrutura. Nesse caso, elas são ambas do tipo [String] ), conforme indicado pelo parenthsis, para a função. Acerta o olho errado, não é?

Espero que isso ajude você a entender por que é difícil usar parênteses ao chamar funções e cmdlets.

    
por 12.12.2016 / 03:06

Tags