在 Powershell 中为每个数组值添加字符串前缀

问题描述 投票:0回答:5

我有一个用户列表,我需要向其授予对一组 Windows 服务的访问权限。它适用于一组定义的用户,但我想让脚本更加动态并动态传递用户和组名称。我可以做到

foreach
,但我希望能够在每个用户的开头添加域名前缀。示例:

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

当我这样做

foreach ($usr in $usrs)
时,需要在
"abc"
前面加上
"AU\abc"
等等。

arrays variables powershell prefix
5个回答
4
投票

一种方法:

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

4
投票

这应该有帮助。

$usrs = "abc", "def", "ghi", "jkl"
foreach ($user in $usrs) {
    "AU\${user}"
}

此外,从 PowerShell 4.0 开始,您也可以执行此操作。

$usrs = "abc", "def", "ghi", "jkl"
$usrs.ForEach({"AU\$_"})

3
投票

你可以试试这个:

foreach($usr in $usrs) {
    $user = "AU\$usr"
    #Continue script...
}

或者如果您需要替换现有阵列:

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

0
投票

如果您在嵌套循环中执行此操作,则内部循环无法访问外部循环中的任何变量。这是在两种情况下都适用的替代方案:

$usrs = @("abc", "def", "ghi") 
$prefixValue = 'AU\'
$usrs | ForEach-Object -Member Insert -ArgumentList @(0, $prefixValue)

0
投票

以下是从性能最高到最慢排序的所有选项。
(除非您正在处理数千条记录,否则性能并不重要。)

从我最喜欢和表现最好的开始:

@("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 的管道。

© www.soinside.com 2019 - 2024. All rights reserved.