在PowerShell中为每个数组值添加前缀

4

我有一个用户列表,需要授予他们一组Windows服务的访问权限。对于一组定义好的用户,它可以正常工作,但我希望使脚本更加动态化,能够动态传递用户和组名。我可以使用foreach,但我想要为每个用户在开头添加域名前缀。例如:

$usrs = "abc", "def", "ghi", "jkl"

当我执行 foreach ($usr in $usrs) 时,需要在 "abc" 前缀中添加 "AU\abc" 等。

5个回答

4
这应该会有所帮助。
$usrs = "abc", "def", "ghi", "jkl"
foreach ($user in $usrs) {
    "AU\${user}"
}

此外,从PowerShell 4.0开始,您也可以这样做。
$usrs = "abc", "def", "ghi", "jkl"
$usrs.ForEach({"AU\$_"})

4

一种方法:

$usrs = "abc", "def", "ghi", "jkl" | % { "AU\"+$_ }

3
你可以尝试这样做:
foreach($usr in $usrs) {
    $user = "AU\$usr"
    #Continue script...
}

如果你需要替换现有的数组:

$usrs = $usrs | Foreach-Object { "AU\$_" }
#or
$usrs = foreach($usr in $usrs) { "AU\$usr" }

1
有很多种方法可以做到这一点。以下是按性能从最高到最低排序的方法。 (不过,除非你处理的记录数量非常多,否则性能并不重要。)
首先是我最喜欢且性能最高的方法:
@("abc", "def", "ghi", "jkl") -replace '^','AU\'

第二个性能最好的版本(大约比第一个版本慢两倍):
foreach ($i in "abc", "def", "ghi", "jkl") { "AU\$i" }

下一个表单,比第一个慢一个数量级:
@("abc", "def", "ghi", "jkl").ForEach{ "AU\$_" }

即使比ForEach方法稍慢一些,因为它利用了管道:
"abc", "def", "ghi", "jkl" | % { "AU\$_" }

尽管这个版本(@Micky贡献)比我上面列出的第一个选项慢了一个数量级,但我认为对于大多数PowerShell用户来说,这是最容易阅读的。非常干净,使用ForEach-Object的管道,几乎每个PowerShell用户都能立即识别和理解。所以这是我在这个列表上的第二个最喜欢的选项。
最后但并非最不重要的,我认为调用每个字符串的Insert()方法也相当容易阅读。请注意,这至少比第一个选项慢两个数量级。
"abc", "def", "ghi", "jkl" | % Insert 0, 'AU\'

或者在旧版本的PowerShell中,您可以使用:
"abc", "def", "ghi", "jkl" | % Insert -ArgumentList @(0, 'AU\')

或者是同样的形式:
"abc", "def", "ghi", "jkl" | % { $_.Insert(0, 'AU\') }

0
如果您正在使用嵌套循环,内部循环无法访问外部循环的任何变量。以下是一种替代方案,可在两种情况下都适用:
$usrs = @("abc", "def", "ghi") 
$prefixValue = 'AU\'
$usrs | ForEach-Object -Member Insert -ArgumentList @(0, $prefixValue)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接