简单的PS脚本,但输出很脏

时间:2017-11-30 20:26:21

标签: powershell powershell-v5.0

我正在写一个我写的脚本的问题。代码可以正常工作但它并没有吐出我想看到它的信息。基本上,它通过最后两个命令之间的一些回车来吐出它。我还试图将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"

2 个答案:

答案 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')
    }