【问题标题】:Pass a function name as variable in script block (function:$Variable)在脚本块中将函数名称作为变量传递(函数:$Variable)
【发布时间】:2018-01-06 21:18:28
【问题描述】:

我很惭愧地抄袭了@mjolinor here 给出的答案的一部分,直到我用$FunctionName 替换copy-fileHC 之前它一直有效。我需要能够将要调用的函数名称作为变量传递。

我想我被抓住了,因为脚本块无法“看到” $FunctionName 变量,但我不确定如何让它工作。我试过传递一个单独的param($functionName),但还是不行。

到目前为止,这是我的脚本(有效):

Function Invoke-FunctionRunAs
{
    [cmdletbinding()]
    Param
    (
        [string]$FunctionName,
        [HashTable]$FunctionParameters,
        [System.Management.Automation.CredentialAttribute()]$Credentials
    )

    $CallingUser = [Security.Principal.WindowsIdentity]::GetCurrent().Name

    $RunAsDomain = $credentials.GetNetworkCredential().Domain
    $RunAsUser = $Credentials.GetNetworkCredential().username

    if(-not($RunAsDomain))
    {
        $RunAsDomain = "."
    }

    #$functionParameters.Add('FunctionName', $FunctionName)    

    Write-Verbose "Calling user: $CallingUser"
    Write-Verbose "Attempting to run scriptblock as $RunAsDomain\$RunAsUser"
    Write-Verbose "Called function: $functionName"
    Write-Verbose ("Passed parameters: $($FunctionParameters | Out-String)") 
    #$FunctionName = "Function:$FunctionName"

    $ScriptBlock = [scriptblock]::Create(".{${Function:Test-Function}} $(&{$args}@FunctionParameters)") #https://stackoverflow.com/questions/28234509/powershell-splatting-the-argumentlist-on-invoke-command

    $ScriptBlock
    Invoke-Command -ComputerName . -Credential $credentials -ScriptBlock $ScriptBlock #-ArgumentList $FunctionName

}

这样称呼:

$params = @{
    Contents = "'Some new text. 003'"
    Number = 3.54*10
}

$credential = New-Object System.Management.Automation.PSCredential('COMPUTER\SomeUser',(ConvertTo-SecureString 'SomeUserPassword' -AsPlainText -Force))

Invoke-FunctionRunAs -FunctionName "Test-Function" -FunctionParameters $params -Credentials $credential -Verbose

但是,将 function:Test-Function 替换为 function:$FunctionName 不起作用。它根本看不到功能。 $scriptblock 的输出如下所示:

.{} -Number: 35.4 -Contents: 'Some new text. 003'

当它工作时,整个函数会在 {} 中打印出来。

在之前的类似question of mine 中,@Daryl 遇到了函数名称中的连字符问题,因此为了测试,我将 Test-Function 重命名为 TestFunction,但无济于事。

如有任何建议/想法,我将不胜感激。

(PS V 5.1 / Win 10)

【问题讨论】:

    标签: powershell


    【解决方案1】:

    解析器会将$functionName 识别为文字函数名。对function: 驱动器使用Get-Content

    $functionDefinition = Get-Content function:\$functionName
    $ScriptBlock = [scriptblock]::Create(".{${functionDefinition}} $(&{$args}@FunctionParameters)")
    

    这也允许在函数名实际上不引用现有函数的情况下进行一些适当的错误处理:

    try{
        $functionDefinition = Get-Content function:\$functionName -ErrorAction Stop
        $ScriptBlock = [scriptblock]::Create(".{${functionDefinition}} $(&{$args}@FunctionParameters)")
    }
    catch{
        throw New-Object Exception "Function $functionName was not found in the current execution context",$_
        return
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-21
      • 1970-01-01
      • 2020-01-13
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 2014-06-04
      • 1970-01-01
      相关资源
      最近更新 更多