这个问题有两个部分。
Run Code Online (Sandbox Code Playgroud)$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 }
我在我的设置上测试了这个,它在大多数情况下都可以正常工作而不会抛出任何异常。有没有更好、更快的方法来检查用户是否存在?另外,我使用的脚本是否万无一失,即使用ErrorAction或使用try....catch处理它会更好吗?
在继续创建它们之前,我将使用此脚本检查多个用户帐户。
情况1
案例二
我知道Out-String是输出差异背后的原因,但我希望输出不仅仅是案例 1 中的testuser1。
我是 Powershell 的新手,所以有人可以帮助我理解为什么输出会有所不同吗?
使用 Try/Catch,大多数情况下,询问并让 Powershell 处理搜索会更快;)
特别是对于长用户列表,检索所有用户然后遍历所有用户会减慢速度,仅询问特定用户会快得多,但如果用户不存在,您需要处理错误。
请参阅下面的示例:
Clear-Host
$ErrorActionPreference = 'Stop'
$VerbosePreference = 'Continue'
#User to search for
$USERNAME = "TestUser"
#Declare LocalUser Object
$ObjLocalUser = $null
Try {
Write-Verbose "Searching for $($USERNAME) in LocalUser DataBase"
$ObjLocalUser = Get-LocalUser $USERNAME
Write-Verbose "User $($USERNAME) was found"
}
Catch [Microsoft.PowerShell.Commands.UserNotFoundException] {
"User $($USERNAME) was not found" | Write-Warning
}
Catch {
"An unspecifed error occured" | Write-Error
Exit # Stop Powershell!
}
#Create the user if it was not found (Example)
If (!$ObjLocalUser) {
Write-Verbose "Creating User $($USERNAME)" #(Example)
# ..... (Your Code Here)
}
Run Code Online (Sandbox Code Playgroud)
关于输出某些数据,我建议您明确定义要输出的内容,这样它们就不会出人意料,并且可以使代码中的内容更清晰。
请参见下面的示例,我明确定义了我想要的 3 个属性,然后将其强制转换为 Table-View,最后将其转换为字符串,因此对我来说不再感到意外了 ;)
Get-LocalUser | Select Name, Enabled, PasswordLastSet | Format-Table | Out-String
Run Code Online (Sandbox Code Playgroud)
示例输出
Name Enabled PasswordLastSet
---- ------- ---------------
Administrator False
DefaultAccount False
Gast False
Test-Gebruiker True 24-12-2017 01:58:12
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用measure来检查用户是否存在
$op = Get-LocalUser | where-Object Name -eq "yourusername" | Measure
if ($op.Count -eq 0) {
# DO SOMETHING
} else {
# REPORT SOMETHING
}
Run Code Online (Sandbox Code Playgroud)
Write-HostToString()在幕后调用对象的方法实现。
Write-Host $op
相当于
Write-Host $op.ToString()
Get-LocalUser | Where-Object {$_.Name -eq "testuser1"}返回一个LocalUser对象。LocalUser.ToString()实现返回Name属性,这就是您看到testuser1输出的原因。
Out-String另一方面,转换命令的整个输出,它是LocalUser具有 3 个属性的对象的表表示。
在情况 2 中,您只能将该输出用作String对象,而在情况 1 中,输出$op是LocalUser可以操作或访问属性的对象。例如,您可以打印更多属性:
Write-Host $op.Name, $op.Enabled, $op.Description
为了查看对象上可用的所有属性/方法,请运行Get-Membercmdlet:
$op | Get-Member