514

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

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

4

13 回答 13

715

你们这太难了。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
于 2012-12-06T16:21:37.947 回答
589

您可以使用IsNullOrEmpty静态方法:

[string]::IsNullOrEmpty(...)
于 2012-12-06T07:48:30.367 回答
52

除了[string]::IsNullOrEmpty为了检查 null 或空之外,您还可以将字符串显式地转换为布尔值或在布尔表达式中:

$string = $null
[bool]$string
if (!$string) { "string is null or empty" }

$string = ''
[bool]$string
if (!$string) { "string is null or empty" }

$string = 'something'
[bool]$string
if ($string) { "string is not null or empty" }

输出:

False
string is null or empty

False
string is null or empty

True
string is not null or empty
于 2012-12-06T08:30:54.067 回答
24

如果它是函数中的参数,您可以使用ValidateNotNullOrEmpty以下示例进行验证:

Function Test-Something
{
    Param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string]$UserName
    )

    #stuff todo
}
于 2015-03-30T12:50:43.193 回答
17

就个人而言,我不接受将空格 ($STR3) 视为“非空”。

当一个只包含空格的变量被传递给一个参数时,它通常会出错,参数值可能不是'$null',而不是说它可能不是一个空格,一些删除命令可能会删除一个根文件夹而不是一个subfolder 如果子文件夹名称是“空格”,那么在许多情况下,所有理由不接受包含空格的字符串。

我发现这是实现它的最佳方法:

$STR1 = $null
IF ([string]::IsNullOrWhitespace($STR1)){'empty'} else {'not empty'}

空的

$STR2 = ""
IF ([string]::IsNullOrWhitespace($STR2)){'empty'} else {'not empty'}

空的

$STR3 = " "
IF ([string]::IsNullOrWhitespace($STR3)){'empty !! :-)'} else {'not Empty :-('}

空的!!:-)

$STR4 = "Nico"
IF ([string]::IsNullOrWhitespace($STR4)){'empty'} else {'not empty'}

不是空的

于 2016-02-10T14:04:08.083 回答
10

PowerShell 2.0 的替代品[string]::IsNullOrWhiteSpace()string -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
于 2019-05-21T12:39:05.407 回答
8

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

function IsNullOrWhitespace($str)
{
    if ($str)
    {
        return ($str -replace " ","" -replace "`t","").Length -eq 0
    }
    else
    {
        return $TRUE
    }
}
于 2017-01-30T22:00:51.250 回答
6
# cases
$x = null
$x = ''
$x = ' '

# test
if ($x -and $x.trim()) {'not empty'} else {'empty'}
or
if ([string]::IsNullOrWhiteSpace($x)) {'empty'} else {'not empty'}
于 2018-03-05T02:45:59.337 回答
2

以纯 PowerShell 方式完成此操作的另一种方法是执行以下操作:

("" -eq ("{0}" -f $val).Trim())

这会成功评估 null、空字符串和空格。我将传递的值格式化为空字符串以处理 null(否则调用 Trim 时 null 将导致错误)。然后只需使用空字符串评估相等性。我认为我仍然更喜欢 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())

或者

!(("$val").Trim())

取决于你想要做什么。

于 2018-02-06T21:37:25.647 回答
1

请注意,"if ($str)"and"IsNullOrEmpty"测试并非在所有情况下都具有可比性:$str=0对两者的赋值都会产生 false,并且取决于预期的程序语义,这可能会产生意外。

于 2016-11-27T19:37:49.287 回答
0

基思希尔的答案的扩展(考虑空格):

$str = "     "
if ($str -and $version.Trim()) { Write-Host "Not Empty" } else { Write-Host "Empty" }

对于空值、空字符串和带有空格的字符串,这将返回“Empty”,而对于其他所有内容,则返回“Not Empty”。

于 2020-08-05T08:45:02.323 回答
0

您可以使用条件语句IsNullOrWhitespace()isNullOrEmpty()静态方法来测试空格或空值。例如,在插入MySQL数据库之前,我循环遍历将输入的值并使用条件来避免空值或空白值。

// RowData is iterative, in this case a hashtable,
// $_.values targets the values of the hashtable

```PowerShell
$rowData | ForEach-Object {
    if(-not [string]::IsNullOrEmpty($_.values) -and
        -not [string]::IsNullOrWhiteSpace($_.values)) {
            // Insert logic here to use non-null/whitespace values
    }
}
于 2021-09-26T13:13:16.077 回答
-2

有点相关的 hack - 您可以排除空值(例如 Excel 习惯在复制到 PowerShell 时包含一个额外的空单元格),如下所示:

get-clipboard | ? {$_}
于 2021-07-11T11:11:49.683 回答