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

标签 powershell lync-2013 skype-for-business

我正在尝试通过自动化脚本运行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) 
}

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

Return $CMDResult 
}

而且大多数命令的工作方式不同于需要将Get-Credential传递给它们的命令(我将它们存储为$ Cpass1等在上面的命令中)-我试图将变量传递为:`$ Cpass1 / /(($ Cpass1)/只是普通的$ Cpass1。

谁能指出我如何通过要调用的命令传递该对象?

最佳答案

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

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

您可以使用$Using范围修饰符在其中嵌入当前变量值,无需转义$或其他任何东西,在构造它时可以利用语法突出显示和制表符补全的优势;总体来说更好。

使用$Using还将正确嵌入复杂的对象,例如[PSCredential]

目前,我只是直接解决您的问题,但是我认为arco444可能对您如何处理整个事情有一点看法。

关于powershell - 通过数组传递Get-Credential以与Invoke-Expression一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33634539/

相关文章:

Powershell - 提示用户然后在 xx 秒后过期提示

c# - 无法从 Lync 2013 sdk 获取可用的音频设备

azure - Bot Framework 迁移到 Azure 是否意味着 Bot Framework 和 Skype for Business channel 的预览状态结束?

c# - 调用 Get-MsolUser 不返回任何结果

azure - 如何修复使用 Start-AzStorageFileCopy 时出现的 "The specified resource does not exist. HTTP Status Code: 404"错误

java - 从 Powershell 运行 Java Jar

powershell - 是否可以通过Lync SDK(2013或其他版本)设置调用转移?

rdp - 由于 RDP 堆栈关闭连接,应用程序共享 session 已断开

c# - 拨出电话录音 [UCMA, S4B]

microsoft-cognitive - 我们可以为 "Skype for Business"构建 Skype 机器人吗?