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