采购ScriptBlock会导致与采购文件不同的行为

时间:2016-02-18 18:42:28

标签: powershell

我希望能够在其中获取具有脚本范围功能的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))
    }

0 个答案:

没有答案