我们通过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]
参数类型的原因是强制它应该是字符串或空字符串。有人可以解释这里发生了什么吗?
答案 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
所示。