我们通过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]参数类型的原因是强制它应该是一个字符串或一个空字符串.有人能解释一下这里发生了什么吗?
一旦你输入变量而不是分配的值,你就是严格输入那个变量.
这更容易看到[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.
| 归档时间: |
|
| 查看次数: |
1880 次 |
| 最近记录: |