在PowerShell中,是否有内置的isnullorempty类函数来检查字符串是否为空?
到目前为止我找不到它,如果有内置的方法,我不想为此写一个函数。
在PowerShell中,是否有内置的isnullorempty类函数来检查字符串是否为空?
到目前为止我找不到它,如果有内置的方法,我不想为此写一个函数。
当前回答
在纯PowerShell中完成这一任务的另一种方法是这样做:
("" -eq ("{0}" -f $val).Trim())
此方法成功计算null、空字符串和空白。我正在将传递的值格式化为空字符串以处理null(否则null将在调用Trim时导致错误)。然后用空字符串求相等值。我想我仍然更喜欢IsNullOrWhiteSpace,但如果您正在寻找另一种方法来实现它,那么这个方法也可以。
$val = null
("" -eq ("{0}" -f $val).Trim())
>True
$val = " "
("" -eq ("{0}" -f $val).Trim())
>True
$val = ""
("" -eq ("{0}" -f $val).Trim())
>True
$val = "not null or empty or whitespace"
("" -eq ("{0}" -f $val).Trim())
>False
在一阵无聊中,我玩了一些,并把它缩短了(尽管更神秘):
!!(("$val").Trim())
or
!(("$val").Trim())
这取决于你想做什么。
其他回答
# cases
$x = null
$x = ''
$x = ' '
# test
if ($x -and $x.trim()) {'not empty'} else {'empty'}
or
if ([string]::IsNullOrWhiteSpace($x)) {'empty'} else {'not empty'}
PowerShell 2.0替换[string]::IsNullOrWhiteSpace()是字符串-notmatch "\S"
("\S" =任何非空白字符)
> $null -notmatch "\S"
True
> " " -notmatch "\S"
True
> " x " -notmatch "\S"
False
性能非常接近:
> Measure-Command {1..1000000 |% {[string]::IsNullOrWhiteSpace(" ")}}
TotalMilliseconds : 3641.2089
> Measure-Command {1..1000000 |% {" " -notmatch "\S"}}
TotalMilliseconds : 4040.8453
您可以创建一个过滤器,将空字符串转换为null,然后只需检查是否为null。
filter nullif {@($_, $null)[$_ -eq '']}
然后你只需要将你的价值注入其中
('' | nullif) -eq $null
> True
('x' | nullif) -eq $null
> False
一个更简单的方法是使用正则表达式
$null -match '^$'
> True
'' -match '^$'
> True
'x' -match '^$'
> False
你们把事情搞得太复杂了。PowerShell非常优雅地处理了这个问题,例如:
> $str1 = $null
> if ($str1) { 'not empty' } else { 'empty' }
empty
> $str2 = ''
> if ($str2) { 'not empty' } else { 'empty' }
empty
> $str3 = ' '
> if ($str3) { 'not empty' } else { 'empty' }
not empty
> $str4 = 'asdf'
> if ($str4) { 'not empty' } else { 'empty' }
not empty
> if ($str1 -and $str2) { 'neither empty' } else { 'one or both empty' }
one or both empty
> if ($str3 -and $str4) { 'neither empty' } else { 'one or both empty' }
neither empty
如果它是一个函数中的参数,你可以用ValidateNotNullOrEmpty验证它,就像你在这个例子中看到的那样:
Function Test-Something
{
Param(
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string]$UserName
)
#stuff todo
}