问题描述
我正在尝试学习PowerShell。
$newuser = ‘ash’,‘bob’,‘charlie’,‘david’
$newuser | foreach({New-LocalUser -Name $_newuser -Password “123123” -Description “Students”})
我想做的是使用列表中的每个名称$newuser
以及密码和我的描述创建新的本地帐户。
我在Google上搜索了很多,并尝试了其他方法,但是没有运气。
是否需要使用此语法创建列表? $newuser = @(ash,bob,charlie,david)
我也对放在-Name
之后的内容感到困惑。
尝试过类似-Name $newuser
,-Name $__.newuser
,-Name $_.($newuser)
等的操作。
我一直在寻找从$newuser
调用每个对象来创建每个用户帐户的方法。
任何建议将不胜感激!
解决方法
您即将到达想要的地方!
声明数组::您会注意到,当您尝试在PowerShell ISE或VSCode中使用$newuser = @(ash,bob,charlie,david)
时,会出现语法错误。这是因为您需要在每个项目周围加上引号。实际上,您完成此操作的方式没有什么不同。这完全取决于您要如何定义数组。有时,使用大数组展开多行时,用@()
了解变量:您可以通过尝试两种方法并使用GetType()
方法来测试这两个数组声明方法:$newuser.GetType()
命名约定:在处理包含多个对象(例如数组)的对象时,请尝试对变量名使用复数形式。因此,在这种情况下,$newuser
应该为$newusers
,并尝试使变量描述它们所包含的内容。 (您在这里做得很好)
$ PSItem和$ _::当您遍历数组时,会有一个漂亮的PowerShell变量,名为$PSItem
,别名也称为$_
。此变量包含您要迭代的当前对象。请参阅下面的示例,了解我如何做这样的事情,但还要记住,大多数情况下有多种方法可以在PowerShell中完成任务。
密码:您在此处使用的cmdlet不会将字符串作为密码,而是需要SecureString。您可以在脚本中将字符串强制设置为SecureString,但实际上只能这样做。最好的做法是拥有一个您从中调用然后切细的文件,或一个在需要传递值时调用的外部密码管理器。 纯文本密码不是一个好主意。
方法1
$newUsers = ‘ash’,‘bob’,‘charlie’,'david’
$securePassword = ConvertTo-SecureString '123123' -AsPlainText -Force
foreach ($user in $newUsers) {
New-LocalUser -Name $user -Password $securePassword -Description 'Students'
}
方法2
$securePassword = ConvertTo-SecureString '123123' -AsPlainText -Force
‘ash’,'david’ | ForEach-Object {New-LocalUser -Name $PSItem -Password $securePassword -Description 'Students'}
这主要是个人喜好,或者您会遵循团队使用的标准,但是我想说第一个是我在脚本中使用的标准,因为我发现它更具可读性,第二个是我会在终端中即时进行。