将空字符串转换为$ null返回相同的变量

时间:2017-03-06 18:27:01

标签: powershell

我们通过PowerShell将一些导入到Active Directory中,其中有几个字段作为数据源中的空字符串出现,但需要在Active Directory中设置为$null

由于这些字段很多,我尝试创建一个将空字符串转换为$null的函数。

麻烦的是,如果我将变量设置回自身,它仍然是一个空字符串。如果我将它设置为新变量,它可以正常工作。

function Get-ValueOrNull
{
    param(
        [Parameter(Mandatory=$true)]
        [AllowEmptyString()]
        [string]$Value
    )

    if ([string]::IsNullOrEmpty($Value))
    {
        return $null
    }

    return [string]$Value
}

function Test-Function
{
    param(
        [Parameter(Mandatory=$true)]
        [AllowEmptyString()]
        [string]$TestValue
    )
    $TestValue = Get-ValueOrNull -Value $TestValue
    $TestValue2 = Get-ValueOrNull -Value $TestValue

    Write-Host "TestValue: $($TestValue -eq $null)"
    Write-Host "TestValue2: $($TestValue2 -eq $null)"
}

Test-Function -TestValue ""

这里的输出是

PS C:\> .\Test-Function.ps1
TestValue: False
TestValue2: True

这显然是我不了解PowerShell函数参数中的类型。我可以将[string]$TestValue更改为$TestValue,它会起作用。

function Test-Function
{
    param(
        [Parameter(Mandatory=$true)]
        [AllowEmptyString()]
        $TestValue
    )
    ...
}
...

输出:

PS C:\> .\Test-Function.ps1
TestValue: True
TestValue2: True

我希望保留[string]参数类型的原因是强制它应该是字符串或空字符串。有人可以解释这里发生了什么吗?

1 个答案:

答案 0 :(得分:5)

一旦你输入变量而不是赋值,你就是在严格输入那个变量。

使用[int]更容易看到,因为基本上任何内容都可以成功投放到[string]

$v = [int]'5'
$v.GetType()  # int

$v = 'hello'
$v.GetType()  # string

[int]$v = '5'
$v.GetType()  # int

$v = 'hello'
# Exception:
# Cannot convert value "hello" to type "System.Int32". Error: "Input string was not in a correct format."

键入参数时,包含参数的变量方式相同;你可以重新分配它,但右侧必须是可分配/ castabale / convertible到左侧的类型。

$null强制转换[string]为空字符串:

([string]$null) -eq ([string]::Empty)  # True

如果在函数中使用不同的中间变量,您仍然可以强烈输入参数,如$TestValue2所示。