2017-03-06 101 views
3

我们有几个通过PowerShell导入到Active Directory中的几个字段,这些字段是来自数据源的空字符串,但需要在Active中设置为$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]参数类型的原因是为了强制执行,它应该是一个字符串或一个空字符串。有人可以解释这里发生了什么吗?

回答

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 /可转换为左侧的类型。

一个$null投为[string]是一个空字符串:

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

您仍然可以强烈地输入您的参数,如果你是不是该函数使用不同的中间变量,如您$TestValue2证明。

相关问题