Eu tenho um arquivo .ps1 no qual desejo definir funções personalizadas.
Imagine que o arquivo se chama MyFunctions.ps1 e o conteúdo é o seguinte:
Write-Host "Installing functions"
function A1
{
Write-Host "A1 is running!"
}
Write-Host "Done"
Para executar esse script e, teoricamente, registrar a função A1, eu navego para a pasta na qual o arquivo .ps1 reside e execute o arquivo:
.\MyFunctions.ps1
Isso gera:
Installing functions
Done
No entanto, quando tento chamar A1, simplesmente recebo o erro informando que não há comando / função com esse nome:
The term 'A1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling
of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:3
+ A1 <<<<
+ CategoryInfo : ObjectNotFound: (A1:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Devo interpretar mal alguns conceitos do PowerShell. Não consigo definir funções nos arquivos de script?
Observe que eu já defini minha política de execução como 'RemoteSigned'. E sei executar arquivos .ps1 usando um ponto na frente do nome do arquivo:. \ MyFile.ps1
powershell
willem
fonte
fonte
Respostas:
Tente isso na linha de comando do PowerShell:
O operador de ponto é usado para incluir scripts.
fonte
. "$PSScriptRoot\MyFunctions.ps1"
. Disponível a partir da v3, antes disso, consulte stackoverflow.com/questions/3667238/… . É MUITO comum.O que você está falando é chamado dot sourcing . E é mau. Mas não se preocupe, existe uma maneira melhor e mais fácil de fazer o que você quer com os módulos (parece muito mais assustador do que é). O principal benefício do uso de módulos é que você pode descarregá-los do shell, se necessário, e evita que as variáveis nas funções entrem no shell (depois que você pontuar um arquivo de função, tente chamar uma das variáveis de um função no shell, e você verá o que quero dizer).
Primeiro, renomeie o arquivo .ps1 que possui todas as suas funções para MyFunctions.psm1 (você acabou de criar um módulo!). Agora, para um módulo carregar corretamente, você precisa fazer algumas coisas específicas com o arquivo. Primeiro, para o Import-Module ver o módulo (você usa esse cmdlet para carregar o módulo no shell), ele deve estar em um local específico. O caminho padrão para a pasta de módulos é $ home \ Documents \ WindowsPowerShell \ Modules.
Nessa pasta, crie uma pasta chamada MyFunctions e coloque o arquivo MyFunctions.psm1 nela (o arquivo do módulo deve residir em uma pasta com exatamente o mesmo nome que o arquivo PSM1).
Feito isso, abra o PowerShell e execute este comando:
Se você vir um chamado MyFunctions, fez tudo certo e seu módulo está pronto para ser carregado (isso é apenas para garantir que ele esteja configurado corretamente, você só precisa fazer isso uma vez).
Para usar o módulo, digite o seguinte no shell (ou coloque esta linha no seu perfil $ ou coloque como a primeira linha em um script):
Agora você pode executar suas funções. O legal disso é que, quando você tiver 10 a 15 funções, vai esquecer o nome de um casal. Se você os tiver em um módulo, poderá executar o seguinte comando para obter uma lista de todas as funções em seu módulo:
É bem legal, e o pequeno esforço que é necessário para montar na frente vale MUITO.
fonte
Import-Module .\buildsystem\PSUtils.psm1
.
comImport-Module
e renomear a extensão, e não requer os módulos para ser colocado em uma pasta específica, ou seja, eu posso tê-lo em qualquer diretório que eu quero, assim como com abastecimento ponto, é Existe alguma razão para fazer o sourcing de pontos nos módulos, considerando os benefícios que vêm para o escopo? (a não ser, claro, aqueles escopo "problemas" é o que você quer). "$PSScriptRoot\MyFunctions.ps1" MyA1Func
Disponível a partir da v3, antes disso, consulte Como posso obter o local do sistema de arquivos de um script do PowerShell? . É MUITO comum.
PS Não assino a regra 'tudo é um módulo'. Meus scripts são usados por outros desenvolvedores fora do GIT, portanto, não gosto de colocar coisas em um local específico ou modificar variáveis de ambiente do sistema antes que meu script seja executado. É apenas um script (ou dois ou três).
fonte
Get-Command -Module FluentMigrator.PowerShell
ser bastante agradável?Você certamente pode definir funções em arquivos de script (então eu tendem a carregá-las através do meu perfil do Powershell em carga).
Primeiro, você precisa verificar se a função está carregada executando:
E verifique se ele aparece na lista (deve ser uma lista de 1!), E deixe-nos saber qual é o resultado obtido!
fonte
Você pode adicionar uma função a:
Uma função estará disponível.
fonte
Se o seu arquivo tiver apenas uma função principal que você deseja chamar / expor, também poderá iniciar o arquivo com:
Você pode chamá-lo, por exemplo, da seguinte maneira:
Isso torna muito mais conveniente se você deseja chamar facilmente apenas essa função sem precisar importá-la.
fonte
[CmdletBinding()]
atributo e o atualiza gratuitamente para uma função avançada. :-)Supondo que você tenha um arquivo de módulo chamado Dummy-Name.psm1, que possui um método chamado Function-Dumb ()
fonte