我希望能够在其中获取具有脚本范围功能的ScriptBlock,并在我的调用脚本中使用它们,而不必使用“script:”为每个调用添加前缀。我读到的东西意味着获取ScriptBlock与从文件中获取相同内容相同,但是当我从文件中获取它时,我可以在不使用“script:”前缀的情况下调用该源代码中的函数。从ScriptBlock获取相同内容时,如果我使用“script:”作为前缀,我只能使用源函数。
function Src-Adjusted-ToolsLibrary {
$Script = get-content "$(split-path $script:MyInvocation.MyCommand.Path)\Library.ps1"
$Script = $Script -ireplace '\s*function\s(\w+)','function script:$1'
#. ([scriptBlock]::Create($Script)) #not working the same as dot sourcing a file because
#when I do this I can only call functions by prefixing
#then with "script:" like "$out=(script:foo 'arg1')
#Invoke-Expression $Script #same issue
#only by saving the data into a temp file and sourcing it am I able to call functions without
#prefixing the call with "script:". This works: "$out=(foo 'arg1)"
$tmpfile = [System.IO.Path]::GetTempFileName()+'.ps1'
$Script > $tmpfile
. $tmpfile
Remove-Item -Force $tmpfile
}
已解决 - 真正的问题是,当我使用Get-Content读取代码时,它是以数组的形式连接在一起,同时将其传递到[ScriptBlock] :: Create($ script)因此,我的源脚本标题中的第一个'#'注释掉了整个脚本。我最初认为问题是ScriptBlock确定异常,但范围问题可能是使用powershell_ide和我的环境中剩余的对象的副作用。所以基本上我需要做的就是在将$ Script输入[ScriptBlock] :: Create之前将输出字段分隔符设置为“r
n”。以下是更正后的代码:
function Src-Adjusted-ToolsLibrary {
$lib="$(split-path $script:MyInvocation.MyCommand.Path)\Library.ps1"
if ( -Not (Test-Path $lib) ) {throw "$lib not found!"}
$Script = get-content $lib
$script = $Script -ireplace 'global','script'
$ofs="`r`n"
. ([scriptBlock]::Create($Script))
}