这个问题有两个部分。
1.我想在创建本地用户之前检查它是否存在。到目前为止,我已经想出了一个简单的脚本来检查本地用户是否存在。下面是在创建用户之前检查用户是否存在的脚本。
$password = ConvertTo-SecureString -String "password" -AsPlainText -Force
$op = Get-LocalUser | Where-Object {$_.Name -eq "testuser1"}
if ( -not $op)
{
New-LocalUser testuser1 -Password $password | Out-Null
}
我在我的设置上测试了这个,它在大多数情况下工作得很好,没有引发任何异常。有没有更好、更快的方法来检查用户是否存在?还有,我用的脚本是万无一失的i例如,使用 ErrorAction 或 *try来处理它会更好。...抓住 *?
我将使用这个脚本检查多个用户帐户,然后再创建它们。
1.为什么$op在以下情况下不同?
案例一
案例二
我知道 Out-String 是导致这种输出差异的原因,但我希望在用例1中输出不仅仅是 * testuser 1 *。
我是PowerShell的新手,所以有人能帮助我理解为什么输出会有差异吗?
4条答案
按热度按时间q9rjltbz1#
使用Try/Catch,大多数时候,直接询问并让Powershell处理搜索会更快;)
特别是对于长用户列表,检索所有用户然后遍历所有用户会减慢速度,只要求特定用户要快得多,但如果用户不存在,则需要处理错误。
参见以下示例:
关于输出某些数据,我建议您显式定义您想要输出的内容,这样他们就不会感到意外,并且它使代码中的内容更清晰。
请看下面的例子,我明确定义了我想要的3个属性,然后将其强制转换为表视图,最后我将其转换为字符串,所以对我来说不再有任何惊喜;)
示例输出
pgky5nke2#
您可以使用度量来检查用户是否存在
8wtpewkr3#
第一行调用Get-LocalUser commandlet并使用Name参数指定要搜索的用户。如果找到该用户,则将分配变量$UserID。如果Get-LocalUser无法找到用户,则会出错,并且不会进行任何分配。指定ErrorAction“SilentlyContinue”将告诉PowerShell不要停止或警告如果赋值出错。
If($UserID)测试将在变量赋值成功时返回True,否则返回False。
ujv3wf0j4#
Write-Host
在幕后调用一个对象的ToString()
方法实现。Write-Host $op
相当于Write-Host $op.ToString()
Get-LocalUser | Where-Object {$_.Name -eq "testuser1"}
返回LocalUser
对象。LocalUser.ToString()
实现返回Name
属性,这就是为什么你看到testuser1
作为输出。另一方面,
Out-String
转换命令的整个输出,该输出是具有3个属性的LocalUser
对象的表表示。在案例2中,您只能将该输出作为
String
对象使用,而在案例1中,$op
是一个LocalUser
对象,您可以操作或访问属性。例如,您可以打印更多属性:Write-Host $op.Name, $op.Enabled, $op.Description
要查看对象上的所有可用属性/方法,请运行
Get-Member
cmdlet:$op | Get-Member