假设从未赋值

时间:2015-08-19 17:55:07

标签: powershell

为简洁起见缩短了代码:

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"

1 个答案:

答案 0 :(得分:3)

我相信这是因为您将用户名变量类型转换为字符串,然后将其设置为$ null作为默认值。类型转换使它成为空字符串或“”,它与$ null不同。

摆脱你的类型转换,或评估:

if($username -eq $null -or $username -eq "" )
{
    $username = $samaccountname
}