当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 测试 PowerShell 哈希表

作者:精品下载站 日期:2024-12-14 07:47:59 浏览:12 分类:玩电脑

测试 PowerShell 哈希表


因此,我一直在观看 Adam Bertram 撰写的 Pluralsight 上的 PowerShell 工具制作基础课程。您可能会惊讶于我观看其他 PowerShell 相关课程,但我总是会学习一些我不知道的东西,找到新的教学技巧或其他让我说“这很酷”的东西。到目前为止,我在 Adam 的课程中发现了其中一些内容。

他演示的技巧之一是使用哈希表作为高级函数的参数值,然后将其分配给 Set-ADuser。为了演示,这里是我的此类函数的简化版本。

Function Update-MyUser {
[cmdletbinding(SupportsShouldProcess)]
Param(
[Parameter(Position = 0, Mandatory, HelpMessage = "Enter a user name")]
[ValidateNotNullorEmpty()]
[Microsoft.ActiveDirectory.Management.ADUser]$Identity,
[Parameter(Position = 1, Mandatory, HelpMessage = "Enter a hashtable of parameter values for Set-ADUser")]
[ValidateNotNullorEmpty()]
[hashtable]$Settings
)

Write-Verbose "Updating $Identity"

Write-Verbose ($Settings | Out-String)
Try {
$user = Get-ADuser $Identity -ErrorAction stop
Write-Verbose $user.distinguishedname
}
Catch {
Throw $_
}

#splat the settings hashtable to Set-ADuUser

$user| Set-ADUser @settings

}

该函数获取指定的用户,然后使用 Set-ADUser 中的参数哈希表更新用户。如果您知道所有参数名称,那么这就很好了。

[玩转系统] 测试 PowerShell 哈希表

我已经轻松更新了用户帐户。

[玩转系统] 测试 PowerShell 哈希表

但是如果我的设置哈希表出现错误怎么办?

[玩转系统] 测试 PowerShell 哈希表

Set-ADUser 没有名为 FirstName 的参数。应该是名字。您可以做的一件事是根据 Set-ADuser 中的参数名称验证哈希表键,这也是本文的重点。

您可以使用 Get-Command 列出所有参数名称。

get-command Set-ADuser | Select -expand Parameters

[玩转系统] 测试 PowerShell 哈希表

我们需要做的是确保设置哈希表中的所有键都在此列表中。这是一个快速测试。

$s = @{Title="T";Description="d"}
$p = get-command set-aduser | select -expand parameters

[玩转系统] 测试 PowerShell 哈希表

我可以使用这样的代码来测试 $s 中的键是否也在 $p 中:

$s.keys | where {$p.keys -contains $_}

[玩转系统] 测试 PowerShell 哈希表

尽管我可能对它们不匹配的情况更感兴趣。

$s.keys | where {$p.keys -notcontains $_}

这不会给出任何结果,因为没有任何内容与过滤器匹配。但如果我用虚假条目修改哈希表,它就会发生。

[玩转系统] 测试 PowerShell 哈希表

考虑到这个概念,我可以修改该函数。

Function Update-MyUser {
[cmdletbinding(SupportsShouldProcess)]
Param(
[Parameter(Position = 0, Mandatory, HelpMessage = "Enter a user name")]
[ValidateNotNullorEmpty()]
[Microsoft.ActiveDirectory.Management.ADUser]$Identity,
[Parameter(Position = 1, Mandatory, HelpMessage = "Enter a hashtable of parameter values for Set-ADUser")]
[ValidateNotNullorEmpty()]
[hashtable]$Settings
)

#get parameters for Set-ADUser
$setparams = Get-Command -Name Set-ADuser | Select -ExpandProperty Parameters
#get keys from Settings that aren't in $SetParams.
$bad = $settings.Keys | where {$setparams.keys -notcontains $_ }

if (-Not $Bad) {

Write-Verbose "Updating $Identity"

Write-Verbose ($Settings | Out-String)
Try {
$user = Get-ADuser $Identity -ErrorAction stop
Write-Verbose $user.distinguishedname
}
Catch {
Throw $_
}

$user| Set-ADUser @settings

}
else {
Write-Warning "The Settings hashtable contains these bad keys: $($bad -join ",")"
}
}

[玩转系统] 测试 PowerShell 哈希表

当然,您可以添加其他代码来列出可用参数、建议更正或其他任何内容。但现在该函数不会尝试运行并优雅地处理坏键。

更正后,该功能将按预期工作。

[玩转系统] 测试 PowerShell 哈希表

请不要将这些视为亚当错过了课程中某些内容的迹象。离得很远。没有任何课程可以绝对教会您构建有效的 PowerShell 工具所需的所有知识。您需要构建适合您的内容并添加您认为合适的错误处理。在这种情况下,我认为这将为您提供一个很好的学习机会,让您了解哈希表键和一些运算符。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯