在PowerShell中,是否有内置的isnullorempty类函数来检查字符串是否为空?

到目前为止我找不到它,如果有内置的方法,我不想为此写一个函数。


当前回答

您可以创建一个过滤器,将空字符串转换为null,然后只需检查是否为null。

filter nullif {@($_, $null)[$_ -eq '']}

然后你只需要将你的价值注入其中

('' | nullif) -eq $null
> True
('x' | nullif) -eq $null
> False

一个更简单的方法是使用正则表达式

$null -match '^$'
> True
'' -match '^$'
> True
'x' -match '^$'
> False

其他回答

# 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非常优雅地处理了这个问题,例如:

> $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

我有一个PowerShell脚本,我必须在一台过时的计算机上运行,它没有[String]::IsNullOrWhiteSpace(),所以我自己写了一个。

function IsNullOrWhitespace($str)
{
    if ($str)
    {
        return ($str -replace " ","" -replace "`t","").Length -eq 0
    }
    else
    {
        return $TRUE
    }
}

在纯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())

这取决于你想做什么。

这里有很多很好的答案;让我用powershell惯用的解决方案提供一个实用的总结:

给定一个变量$str,它可能包含$null或字符串(或任何标量):

# Test for $null or '' (empty string).
# Equivalent of: [string]::IsNullOrEmpty($str)
$str -like ''

# Test for $null or '' or all-whitespace.
# Equivalent of: [string]::IsNullOrWhitespace($str)
$str -notmatch '\S'  

Using the string-only -like operator implicitly coerces the LHS to a string, and since [string] $null yields the empty string, both '' -like '' and $null -like '' yield $true. Similarly, the regex-based -match / -notmatch operators, as string-only operators, coerce their LHS operand to a string, and $null is treated like '' in this conversion. \S is a regex escape sequence that matches any non-whitespace character (it is the negated form of \s). -match / -notmatch perform substring matching by default (and only ever return one match), so if \S matches, the implication is that at least one character that isn't a whitespace character is present.


警告:

鉴于PowerShell的动态类型,您可能无法提前知道存储在给定变量中的值的类型。

虽然上述技术可预测地适用于$null、[string]实例和其他不可枚举的类型,但可枚举值(字符串除外)可能会产生令人惊讶的结果,因为如果like和-notmatch的LHS是可枚举值(松散地说:集合),则该操作应用于每个元素,而不是返回单个布尔值,而是返回匹配元素的子数组。

在条件上下文中,将数组强制转换为布尔值的方式有点违反直觉;如果数组只有一个元素,则该元素本身被强制转换为布尔值;对于两个或两个以上的元素,数组总是被强制为$true,而不管元素值如何——请参阅这个答案的底部部分。例如:

# -> 'why?', because @('', '') -like '' yields @('', ''), which
# - due to being a 2-element array - is $true
$var = @('', '')
if ($var -like '') { 'why?' }

如果将非字符串可枚举LHS强制转换为[string], PowerShell将通过空格连接其(经过字符串化的)元素来对其进行字符串化。 当你调用[string]::IsNullOrEmpty()或[string]:: isnullowhitespace()时,这也是隐式发生的,因为它们的参数是[string]类型的。

因此,使用上述字符串化规则的类型不可知的等价物是:

# Test for $null or '' (empty string) or any stringified value being ''
# Equivalent of: [string]::IsNullOrEmpty($var)
[string] $var -like ''

# Test for $null or '' or all-whitespace or any stringified value being ''
# Equivalent of: [string]::IsNullOrWhitespace($var)
[string] $var -notmatch '\S'