Answers:
您可以使用IsNullOrEmpty
静态方法:
[string]::IsNullOrEmpty(...)
!
。仅在较新版本的PowerShell中有效。!
是-not
你们让这件事变得太难了。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
IsNullOrWhitespace()
用于该场景。但是在使用PowerShell编写脚本11年之后,我发现我很少需要进行字符串测试。:-)
除了[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
If
子句内部将括号内的所有内容转换为单个布尔值,这意味着if($string){Things to do for non-empty-nor-null}
或if(!$string){Things to do for empty-or-null}
不进行显式转换[bool]
就足够了。
我个人不接受空格($ 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'}
不是空的
# 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()
是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
以纯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())
取决于您要执行的操作。
请注意,"if ($str)"
和"IsNullOrEmpty"
测试并非在所有情况下$str=0
均能正常工作:对两者分配false都会产生false,并且取决于预期的程序语义,这可能会产生意外。
检查长度。如果对象存在,它将有一个长度。
空对象没有长度,不存在并且无法检查。
字符串对象有一个长度。
问题是: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
Null objects have no length
您是否尝试过执行$null.length
?:-)为了进行快速的布尔测试,管道传递到Get-Member,然后必须处理$ null情况下的结果错误,这对我来说似乎有点沉重。