2017-07-31 9 views
1

@mjolinor、hereによって与えられた答えの一部を恥知らずに剽窃しています。copy-fileHC$FunctionNameに置き換えるまで機能します。変数として呼び出す関数の名前を渡すことができる必要があります。

私はスクリプトブロックが$ 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:$FunctionNamefunction:Test-Functionを交換することはできません。この関数はまったく表示されません。それは全体の機能が{}の内側にプリントアウトされた作品とき

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

:$スクリプトブロックの出力は次のようになります。

以前のように、@Darylは関数名のハイフンに問題がありました。テストするために、Test-Functionの名前をTestFunctionに変更しましたが、役に立たなかった。

私はどんな提案/アイデアにも感謝します。

(PS V 5.1 /勝利10)

答えて

1

パーサはリテラル関数名として$functionNameを認識するであろう。

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 
} 
:これはまた、関数名は、実際に既存の関数を参照していない場合の取り扱い一部の適切なエラーを可能

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

:代わりにfunction:ドライブに対してGet-Contentを使用します

関連する問題