我有一个函数返回一个调用另一个函数的脚本块。 (这听起来可能过于复杂,但在实际代码中却很有意义。)
它适用于ISE,但不适用于常规控制台。
我做错了,或者这是PowerShell中的错误?有解决方法吗?
以下是显示问题的一些最小代码:
function SomeFunc([string]$name)
{
"Hello, $name!"
}
function GetBlock([string]$name)
{
{ SomeFunc $name }.GetNewClosure()
}
$block = GetBlock("World")
& $block
请将代码放入文件并执行该操作以查看错误。如果您只是将其粘贴到控制台中,则不会出现错误。
当我按下F5在ISE中运行它时,我得到了预期的结果:
Hello, World!
但是,当我在常规控制台中运行它时,出现错误:
SomeFunc : The term 'SomeFunc' 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 E:\scratch\Untitled4.ps1:8 char:7
+ { SomeFunc $name}.GetNewClosure()
+ ~~~~~~~~
+ CategoryInfo : ObjectNotFound: (SomeFunc:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
这是我的$psversiontable
:
Name Value
---- -----
PSVersion 5.1.16299.251
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.16299.251
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
答案 0 :(得分:2)
将脚本块中调用的函数范围设置为global
,得到所需的Hello, World!
。
function global:SomeFunc([string]$name)
{
"Hello, $name!"
}
请注意,使SomeFunc
全局变为导致它在脚本完成执行后仍然可用,因此您需要注意命名以避免屏蔽其他命令。