我有一个用户列表,我需要向其授予对一组 Windows 服务的访问权限。它适用于一组定义的用户,但我想让脚本更加动态并动态传递用户和组名称。我可以做到
foreach
,但我希望能够在每个用户的开头添加域名前缀。示例:
$usrs = "abc", "def", "ghi", "jkl"
当我这样做
foreach ($usr in $usrs)
时,需要在 "abc"
前面加上 "AU\abc"
等等。
一种方法:
$usrs = "abc", "def", "ghi", "jkl" | % { "AU\"+$_ }
这应该有帮助。
$usrs = "abc", "def", "ghi", "jkl"
foreach ($user in $usrs) {
"AU\${user}"
}
此外,从 PowerShell 4.0 开始,您也可以执行此操作。
$usrs = "abc", "def", "ghi", "jkl"
$usrs.ForEach({"AU\$_"})
你可以试试这个:
foreach($usr in $usrs) {
$user = "AU\$usr"
#Continue script...
}
或者如果您需要替换现有阵列:
$usrs = $usrs | Foreach-Object { "AU\$_" }
#or
$usrs = foreach($usr in $usrs) { "AU\$usr" }
如果您在嵌套循环中执行此操作,则内部循环无法访问外部循环中的任何变量。这是在两种情况下都适用的替代方案:
$usrs = @("abc", "def", "ghi")
$prefixValue = 'AU\'
$usrs | ForEach-Object -Member Insert -ArgumentList @(0, $prefixValue)
以下是从性能最高到最慢排序的所有选项。
(除非您正在处理数千条记录,否则性能并不重要。)
从我最喜欢和表现最好的开始:
@("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 用户来说它是最容易阅读的。非常干净,每个 PowerShell 用户几乎肯定会立即识别和理解带有 ForEach-Object 的管道。