格式化foreach命令的输出

时间:2019-01-30 13:31:05

标签: powershell

我是Powershell的新手,我不知道如何格式化此foreach循环oneliner的输出。

foreach ($user in cat C:\list.txt) {Get-ADUser $user | select -Property             
GivenName,Surname,SamAccountName}

GivenName Surname    SamAccountName
--------- -------    --------------
Bob       Smith      SmithB
Fred      Williams   WilliamsF
Ann       Jones      JonesA
Joan      Scott      ScottJ
Eve       Wood       WoodE
George    Peters     PetersG
Alice     Watt       Watt

C:\ list.txt包含SamAccountName的列表,每行一个。

我正在寻找的是使输出看起来像这样:

Bob Smith SmithB; Fred Williams WilliamsF; Ann Jones JonesA; Joan Scott ScottJ; Eve Wood WoodE; George Peters PetersG; Alice Watt Watt

我也想避免在此过程中创建任何新文件。

2 个答案:

答案 0 :(得分:1)

一个简单的解决方案是:

$result = '';
foreach ($user in cat C:\list.txt) {
  $adUser = Get-ADUser $user | select -Property GivenName,Surname,SamAccountName
  $result += [string]::Format("{0} {1} {2}; ", $adUser.GivenName, $adUser.Surname, $adUser.SamAccountName)
}
$result

答案 1 :(得分:1)

简洁的解决方案(PSv2 +):

(Get-Content C:\list.txt | Get-ADUser | ForEach-Object {
  '{0} {1} {2}' -f $_.GivenName, $_.SurName, $_.SamAccountName
}) -join ';'
  • Get-Content C:\list.txt | Get-ADUser使用管道将用户名提供给Get-ADUser(将输入字符串隐式绑定到其-Identity参数);结果是一个AD用户对象数组。

    • 使用流水线与foreach循环之间存在权衡(内存消耗与速度);除非存在已知的性能问题,否则管道将提供更简洁,优雅的解决方案。
  • 将结果传递到ForEach-Object%)cmdlet允许通过脚本块({ ... })逐个处理生成的AD用户对象,其中{{ 1}}代表手边的输入对象。

  • $_使用PowerShell的字符串格式运算符'{0} {1} {2}' -f $_.GivenName, $_.SurName, $_.SamAccountName从给定用户对象的属性构建字符串。请注意,由于您可以直接在AD用户对象上访问感兴趣的属性,因此无需进行中间-fselect)调用。

  • 将整个管道包含在Select-Object中会导致一个数组字符串 [1] ,然后(...)将其合并成表格以-join作为分隔符的单个输出字符串。


[1]严格来说,如果;仅包含 1 名称,则输出将是 scalar ,即 single字符串。但是,C:\list.txt运算符也接受标量作为LHS,在这种情况下,该运算是无操作的(无条件加入)。