我是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
我也想避免在此过程中创建任何新文件。
答案 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用户对象上访问感兴趣的属性,因此无需进行中间-f
(select
)调用。
将整个管道包含在Select-Object
中会导致一个数组字符串 [1] ,然后(...)
将其合并成表格以-join
作为分隔符的单个输出字符串。
[1]严格来说,如果;
仅包含 1 名称,则输出将是 scalar ,即 single字符串。但是,C:\list.txt
运算符也接受标量作为LHS,在这种情况下,该运算是无操作的(无条件加入)。