Tenho um arquivo de script do PowerShell que contém a função abaixo. É chamadomy_functions.ps1
function Get-My-PlainText()
{
[CmdletBinding()]
param
(
[parameter(Mandatory = $true)][System.Security.SecureString]$SecureString
)
BEGIN { }
PROCESS
{
$bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureString);
try
{
return [Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr);
}
finally
{
[Runtime.InteropServices.Marshal]::FreeBSTR($bstr);
}
}
END { }
}
Tenho outro script (chamado scriptB.ps1) que deve chamar este arquivo de função antes de usar as funções referenciadas pelo arquivo
scriptB.ps1
chama o arquivo de função executando o seguinte inline dentro do arquivo.
powershell .\my_functions.ps1
Import-Module .\my_functions.ps1
Recebo o erro abaixo.
The term 'Get-My-Plaintext' is not recognized as a name of a cmdlet, function, script file, or executable program. Check the spelling of the name, or if a path was included, verify that the path is
| correct and try again.
Atualmente, esse comportamento acontece no terminal do PowerShell executando o PowerShell v 7.45, e a única maneira de corrigi-lo é copiar a função e colá-la no terminal.
Existe uma maneira de resolver esse problema e evitar a necessidade de copiar e colar as funções? É apenas essa função que apresenta esse problema.
Desde já, obrigado.
Há duas soluções claras para o seu problema.
1. Fonte de ponto
Alterar powershell para um ponto
Quando você chama o powershell, na verdade está chamando o powershell.exe, que inicia um processo/sessão diferente, carrega a função naquela sessão, então a sessão termina e leva aquela definição com ela. O dot sourcing puxará aquela função para seu escopo atual.
2. Renomeie .ps1 para .psm1 e use Import-Module
Isso importará funções para a sessão atual.
Além disso, como Darin apontou nos comentários, você tem um par extra de parênteses. Quando você define uma função, você pode usar a sintaxe inline
ou com um
Param()
bloco. (Decorar o bloco param com[cmdletbinding()]
ou pelo menos um parâmetro com[parameter()]
o torna uma função avançada )Não parece causar problemas como o seu, mas é, no mínimo, confuso para os outros.
EDITAR
mklement0 apontou que o Import-Module funciona em .ps1 também. Ele está correto, como acabei de confirmar. Vou deixar a resposta como está, mas renomear para psm1 NÃO é necessário.