如何在PowerShell中检查字符串是否为null或为空?


Answers:


471

您可以使用IsNullOrEmpty静态方法:

[string]::IsNullOrEmpty(...)

3
我更喜欢这种方式,因为无论您具有什么Powerhsell知识,它都会做什么,这很明显-这对非Powershell程序员来说是有意义的。
PencilCake 2012年

18
我想你可以做!$ var
Shay Levy

4
使用PowerShell需要了解的一件事是,传递给Commandlet或函数的空字符串不会保持为空。它们被转换为空字符串。请参阅connect.microsoft.com/PowerShell/feedback/details/861093/…上的Microsoft Connect错误。
JamieSee 2014年

25
考虑[String] :: IsNullOrWhiteSpace(...)也用于验证空白。

3
@ShayLevy小心!。仅在较新版本的PowerShell中有效。!-not
Kolob Canyon

598

你们让这件事变得太难了。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

30
@pencilCake是的,我的意思和上面的示例在实际操作中显示了它。测试不会检查的是IsNullOrWhitespace()。
基思·希尔

3
从脚本的角度来看,我更好地同意此解决方案。与往常一样,基思·希尔(Keith Hill)有正确的解决方案!谢谢。
Vippy 2015年

2
您说的很优雅,但是由于某种原因,感觉就像是JS。
丹·阿特金森

2
@VertigoRay请参阅上面的我的第一条评论,我建议将其IsNullOrWhitespace()用于该场景。但是在使用PowerShell编写脚本11年之后,我发现我很少需要进行字符串测试。:-)
Keith Hill

3
“ KeithHill。抱歉,由于您的意图尚不清楚,因此仍然不安全。当您使用[string] :: IsNullOrEmpty时,您绝对清楚。 -isNullOrEmpty谓词就是其中之一...
德米特里(Dmitry),2016年

40

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

$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

4
好点。If子句内部将括号内的所有内容转换为单个布尔值,这意味着if($string){Things to do for non-empty-nor-null}if(!$string){Things to do for empty-or-null}不进行显式转换[bool]就足够了。
Ch.Idea '16

20

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

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

    #stuff todo
}

10

我个人不接受空格($ STR3)为“不为空”。

当仅包含空格的变量传递给参数时,通常会错误地指出参数值可能不是'$ null',而不是说它可能不是空格,某些删除命令可能会删除根文件夹而不是如果子文件夹名称是“空白”,则在许多情况下,所有原因都不接受包含空格的字符串。

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

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

不是空的


5

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

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

5
# cases
$x = null
$x = ''
$x = ' '

# test
if ($x -and $x.trim()) {'not empty'} else {'empty'}
or
if ([string]::IsNullOrWhiteSpace($x)) {'empty'} else {'not empty'}

3

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

1

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

取决于您要执行的操作。


1

请注意,"if ($str)""IsNullOrEmpty"测试并非在所有情况下$str=0均能正常工作:对两者分配false都会产生false,并且取决于预期的程序语义,这可能会产生意外。


$ str = 0不是一个好的编码习惯。$ str ='0'无疑将使IsNullOrEmpty的预期结果是什么。
德米特里(Dmitry)

-1

检查长度。如果对象存在,它将有一个长度。

空对象没有长度,不存在并且无法检查。

字符串对象有一个长度。

问题是:IsNull或IsEmpty,不是IsNull或IsEmpty或IsWhiteSpace

#Null
$str1 = $null
$str1.length
($str1 | get-member).TypeName[0]
# Returns big red error

#Empty
$str2 = ""
$str2.length
($str2 | get-member).TypeName[0]
# Returns 0

## Whitespace
$str3 = " "
$str3.length
($str3 | get-member).TypeName[0]
## Returns 1 

2
RE- Null objects have no length您是否尝试过执行$null.length?:-)为了进行快速的布尔测试,管道传递到Get-Member,然后必须处理$ null情况下的结果错误,这对我来说似乎有点沉重。
基思·希尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.