通过数组传递 Get-Credential 以与 Invoke-Expression 一起使用

Passing Get-Credential through array to use with Invoke-Expression

我正在尝试 运行 通过自动脚本测试 Lync / S4B 命令,目前我设置了一个命令数组,如下所示:

$HealthCheckCoreCmdlets = @{
    "AddressBookService" = "Test-CsAVConference -TargetFQDN $($fqdn)"
    "AddressBookWebQuery" = "Test-CSAddressBookWebQuery -TargetFQDN $($fqdn)"
    "ASConference" = "Test-CsASConference -TargetFQDN $($fqdn) -SenderSipAddress $($CTestUser1) -SenderCredential $($Cpass1) -ReceiverSipAddress $($CTestUser2) -ReceiverCredential $($Cpass2)"
    "AVConference" = "Test-CsAVConference -TargetFQDN $($fqdn) "
    "ClientAuthentication" = "Test-CsClientAuthentication -TargetFQDN $($fqdn) -UserSipAddress $($CTestUser1) -UserCredential $($Cpass1)"
    "DataConference" = "Test-CsDataConference -TargetFQDN $($fqdn)"
    "GroupExpansion" = "Test-CsGroupExpansion -TargetFQDN $($fqdn) -GroupEmailAddress $($CGroupEmail)"
    "GroupIm" = "Test-CsGroupIm -TargetFQDN $($fqdn)"
    "Im" = "Test-CsIm -TargetFQDN $($fqdn)"
    "LisConfiguration" = "Test-CsLisConfiguration -TargetFQDN $($fqdn) -Subnet $($CSubnet) -UserSipAddress $($CTestUser1) -UserCredential $($Cpass1)"
    "LocationPolicy" = "Test-CsLocationPolicy -TargetFQDN $($fqdn)"
    "P2PAV" = "Test-CsP2PAV -TargetFQDN $($fqdn)"
    "Presence" = "Test-CsPresence -TargetFQDN $($fqdn)"
    "Registration" = "Test-CsRegistration -TargetFQDN $($fqdn)"
    "Replica" = "`$testReplica = Test-CsReplica; if(`$testReplica -eq `$null){return 'Success'}else{return 'Failure'}"
    "Topology" = "`$testtopology = Test-CsTopology; if(`$testtopology -eq `$null){return 'Success'}else{return 'Failure'}"
    "UcwaConference" = "Test-CsUcwaConference -TargetFQDN $($fqdn)"
    "WebApp" = "Test-CsWebApp -TargetFQDN $($fqdn)"
}

然后我使用 Invoke-Expression 来 运行 命令:

foreach ($PSHCmdlet in $HealthCheckCoreCmdlets.GetEnumerator() | Sort-Object Key) 
{ 
    Update-Status $PSHCmdlet.Key
    $Corearray."$($PSHCmdlet.Key)" += (Get-CMDLetResult $PSHCmdlet.Value) 
}

获取-CMDLetResult:

function Get-CMDLetResult ($Value) {
$CMDResult = (Invoke-Expression ("$($Value)"))

Return $CMDResult 
}

除了需要传递给它们的 Get-Credential 的命令之外,大多数命令都有效(我将它们作为 $Cpass1 等存储在上面的命令中)- 我尝试将变量传递为:`$ Cpass1 / $($Cpass1) / 只是简单的 $Cpass1.

谁能告诉我如何使用要调用的命令传递此对象?

首先,我认为您最好将命令定义为 [ScriptBlock]s 而不是 [String]s:

$HealthCheckCoreCmdlets = @{
    "AddressBookService" = { Test-CsAVConference -TargetFQDN $Using:fqdn }
    # ...
    "Replica" = {
        $testReplica = Test-CsReplica
        if ($testReplica -eq $null) {
            return 'Success'
        } else { 
            return 'Failure'
        }
    }
}

您可以使用 $Using 范围修饰符在其中嵌入当前变量值,您没有转义 $ 或其他任何东西,您可以获得语法高亮和制表符完成的优势建造它;总体来说更好。

使用 $Using 也可以正确嵌入复杂对象,例如 [PSCredential]

目前我只是直接回答你的问题,但我认为 arco444 可能对你如何处理这整件事有意见。