为简洁起见缩短了代码:
Function Add-DatabaseUser
{
Param(
[Parameter(Mandatory=$true, Position = 0)]
[string] $samaccountname
,[Parameter(Position = 1)]
[string] $username = $null
)
if ($samaccountname -notmatch "[a-z0-9]*\\[a-z0-9]")
{
throw new [System::ArgumentException] "SAMAccountName was not in the correct format."
}
if($username -eq $null)
{
$username = $samaccountname
}
# Code omitted...
Try
{
Write-Host "Creating user..."
$user = New-Object ("Microsoft.SqlServer.Management.Smo.User") $database, $username
$user.Login = $login.Name
$user.Create() # Exception thrown.
}
Catch
{
# Code omitted.
}
我得到的例外情况如下:
对象或列名称缺失或为空。对于SELECT INTO语句, 验证每列是否有名称。对于其他语句,请查找空别名。别名 定义为""或[]是不允许的。将别名更改为有效名称。
这是因为$ username的值为null。然而,我在脚本的最开头有一个if语句来检查它是否为null,如果是,则为其赋值。但显然调试器会将$username -eq $null
评估为False。
为什么会这样?
编辑:应该提一下这就是我在PowerShell中调用该函数的方式:
Add-DatabaseUser -samaccountname "mycomputer\username"
答案 0 :(得分:3)
我相信这是因为您将用户名变量类型转换为字符串,然后将其设置为$ null作为默认值。类型转换使它成为空字符串或“”,它与$ null不同。
摆脱你的类型转换,或评估:
if($username -eq $null -or $username -eq "" )
{
$username = $samaccountname
}