我正在写一个我写的脚本的问题。代码可以正常工作但它并没有吐出我想看到它的信息。基本上,它通过最后两个命令之间的一些回车来吐出它。我还试图将Get-ADUser
命令转储到一个数组中,然后将$Pass
中的数据添加到所述数组中,但这种情况很糟糕,我无法让它工作;我尝试编写和执行它的每一种方式都会产生错误。我是在正确的轨道上还是有更好的方法来做到这一点?如果这是它应该做的方式,我怎么能按照我喜欢的方式清理?
$User = Read-Host "Enter the UserName you wish to look up."
$UserInfo = Get-ADUser $User -Properties * | Select-Object -Property DisplayName, GivenName, Initials, Surname, SamAccountName, @{Name = 'Student ID'; Expression = {$_.EmployeeID}}
$Pass = '{0}{1}{2}#{3}' -f @(
$UserInfo.GivenName[0].ToString().ToUpper(),
$UserInfo.Initials[0].ToString().ToLower(),
$UserInfo.Surname[0].ToString().ToLower(),
$UserInfo.'Student ID')
$UserInfo | fl
Write-host "Password : $Pass"
答案 0 :(得分:1)
您可以将$Pass
添加为属性,就像使用Student Id
属性一样。
$User = Read-Host "Enter the UserName you wish to look up."
$UserInfo = Get-ADUser $User -Properties * | Select-Object -Property DisplayName, GivenName, Initials, Surname, SamAccountName, @{Name = 'Student ID'; Expression = {$_.EmployeeID}}
$Pass = '{0}{1}{2}#{3}' -f @(
$UserInfo.GivenName[0].ToString().ToUpper(),
$UserInfo.Initials[0].ToString().ToLower(),
$UserInfo.Surname[0].ToString().ToLower(),
$UserInfo.'Student ID')
$UserInfo | Select *,@{l='Password';e={$Pass}} | fl
就此而言,你可以全部内联......
Read-Host "Enter the UserName you wish to look up." | Get-ADUser -Properties * | Select-Object -Property DisplayName, GivenName, Initials, Surname, SamAccountName, @{Name = 'Student ID'; Expression = {$_.EmployeeID}},@{l='Password';e={'{0}{1}{2}#{3}' -f $_.GivenName[0].ToString().ToUpper(), $_.Initials[0].ToString().ToLower(), $_.Surname[0].ToString().ToLower(), $_.'Student ID')}} | fl
但这确实很长,难以阅读。
要解释行$UserInfo | Select *,@{l='Password';e={$Pass}} | fl
,这很简单。我将ADUser对象传递给Select-Object
,在那里我使用*
通配符选择它拥有的所有属性,并添加计算属性。我确实使用了一些较短的别名,但实质上它是一个哈希表,您可以在其中定义要定义的属性的名称/标签,以及一个定义它的值的表达式。完全可以是:
@{
label = 'Password'
expression = {$Pass}
}
因为它正在寻找'label'(或'name')作为参数的参数,而'expression'正在寻找另一个参数,我们可以将它们简化为'l'和'e'作为每个的第一个字母,这会将整个内容缩短到我在代码中看到的内容。
答案 1 :(得分:0)
我改变了使用格式运算符的代码位来补偿缺少中间名/初始值,如我的一条评论中所述。如果他们需要,我希望它可以帮助别人。
# This attempts to format the password according to our convention.
IF([String]::IsNullOrEmpty($UserInfo.Initials)) {
$Pass = '{0}{1}#{2}' -f @(
$UserInfo.GivenName[0].ToString().ToUpper(),
$UserInfo.Surname[0].ToString().ToLower(),
$UserInfo.'Student ID')
} Else {
$Pass = '{0}{1}{2}#{3}' -f @(
$UserInfo.GivenName[0].ToString().ToUpper(),
$UserInfo.Initials[0].ToString().ToLower(),
$UserInfo.Surname[0].ToString().ToLower(),
$UserInfo.'Student ID')
}