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

Kir*_*irk 3 powershell

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

由于这些字段中有相当多,我尝试创建一个将空字符串转换为的函数$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 ""
Run Code Online (Sandbox Code Playgroud)

这里的输出是

PS C:\> .\Test-Function.ps1
TestValue: False
TestValue2: True
Run Code Online (Sandbox Code Playgroud)

这显然是我不了解PowerShell函数参数中的类型.我可以改变[string]$TestValue$TestValue,它会工作.

function Test-Function
{
    param(
        [Parameter(Mandatory=$true)]
        [AllowEmptyString()]
        $TestValue
    )
    ...
}
...
Run Code Online (Sandbox Code Playgroud)

输出:

PS C:\> .\Test-Function.ps1
TestValue: True
TestValue2: True
Run Code Online (Sandbox Code Playgroud)

我想保留[string]参数类型的原因是强制它应该是一个字符串或一个空字符串.有人能解释一下这里发生了什么吗?

bri*_*ist 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."
Run Code Online (Sandbox Code Playgroud)

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

一个转换$null[string]空字符串:

([string]$null) -eq ([string]::Empty)  # True
Run Code Online (Sandbox Code Playgroud)

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