通过数组传递 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 可能对你如何处理这整件事有意见。
我正在尝试 运行 通过自动脚本测试 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 可能对你如何处理这整件事有意见。