我有一个包含以下函数的 powershell 脚本文件。它被称为my_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 { }
}
我有另一个脚本(称为 scriptB.ps1),它应该在使用该文件引用的函数之前调用此函数文件
scriptB.ps1
通过在文件中运行以下命令来调用函数文件。
powershell .\my_functions.ps1
Import-Module .\my_functions.ps1
我收到以下错误。
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.
目前,此行为发生在运行 powershell v 7.45 的 powershell 终端上,修复此问题的唯一方法是复制该函数并将其粘贴到终端上。
有没有办法解决这个问题并避免复制和粘贴函数,只有这个函数有这个问题。
提前致谢。
您的问题有两个明确的解决方案。
1.点源
将 powershell 更改为点
当您调用 powershell 时,实际上是在调用 powershell.exe,它会启动不同的进程/会话,将函数加载到该会话中,然后会话结束并带走该定义。Dot sourcing 会将该函数拉入您当前的作用域。
2. 将 .ps1 重命名为 .psm1 并使用 Import-Module
这会将函数导入当前会话。
此外,正如 Darin 在评论中指出的那样,您有一对额外的括号。定义函数时,可以使用内联语法
或使用块。(使用或至少一个参数
Param()
修饰参数块可使其成为高级函数)[cmdletbinding()]
[parameter()]
它似乎不会像您遇到的那样引起问题,但至少会让其他人感到困惑。
编辑
mklement0指出 Import-Module 也适用于 .ps1。正如我刚刚证实的那样,他是对的。我将保留原答案,但无需重命名为 psm1。