简单 PS 脚本但输出脏

Simple PS script but dirty output

我正在编写的脚本有问题。代码 有效 但它并没有吐出我希望看到的信息。基本上,它会在最后两个命令之间用一些回车 returns 吐出来。我还尝试将 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"

您可以将 $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,其中我使用 * 通配符 select 它拥有的所有属性,并且还添加了一个计算的 属性。我确实使用了一些较短的别名,但本质上它是一个哈希表,您可以在其中定义所定义的 属性 的 name/label,以及定义其值的表达式。完全可以是:

@{
    label = 'Password'
    expression = {$Pass}
}

因为它正在寻找 'label'(或 'name')作为参数的参数,而 'expression' 作为另一个参数,我们可以将它们缩短为 'l' 和'e' 作为每个字母的第一个字母,将整个内容缩短为您在我的代码中看到的内容。

我更改了使用格式运算符的代码位,以补偿中间 name/initial 的缺失,如我的评论之一所述。我希望它能帮助某人,如果他们需要的话。

# 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')
    }