将函数名称作为脚本块中的变量传递 (function:$Variable)



我很惭愧地抄袭了@mjolinor给出的答案的一部分,在这里,它一直有效,直到我用$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('COMPUTERSomeUser',(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'

当它工作时,整个功能在{}内打印出来。

在我的一个类似的问题中,@Daryl函数名称中的连字符有问题,所以为了测试,我将测试函数重命名为 TestFunction,但无济于事。

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

(PS V 5.1/Win 10(

解析器会将$functionName识别为文字函数名称。请改用Get-Contentfunction:驱动器:

$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
}

相关内容

最新更新