在PowerShell中,是否有内置的isnullorempty类函数来检查字符串是否为空?
到目前为止我找不到它,如果有内置的方法,我不想为此写一个函数。
在PowerShell中,是否有内置的isnullorempty类函数来检查字符串是否为空?
到目前为止我找不到它,如果有内置的方法,我不想为此写一个函数。
当前回答
你们把事情搞得太复杂了。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惯用的解决方案提供一个实用的总结:
给定一个变量$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'
你可以使用IsNullOrEmpty静态方法:
[string]::IsNullOrEmpty(...)
我有一个PowerShell脚本,我必须在一台过时的计算机上运行,它没有[String]::IsNullOrWhiteSpace(),所以我自己写了一个。
function IsNullOrWhitespace($str)
{
if ($str)
{
return ($str -replace " ","" -replace "`t","").Length -eq 0
}
else
{
return $TRUE
}
}
可以同时使用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
}
}
另一种选择是向系统中添加2个新的脚本方法。使用Update-TypeData的字符串实例:
Update-TypeData -MemberType ScriptMethod -MemberName IsNullOrEmpty -Value {
return [string]::IsNullOrEmpty($this)
} -TypeName System.String
Update-TypeData -MemberType ScriptMethod -MemberName IsNullOrWhiteSpace -Value {
return [string]::IsNullOrWhiteSpace($this)
} -TypeName System.String
'hello'.IsNullOrEmpty() # => False
''.IsNullOrEmpty() # => True
' '.IsNullOrEmpty() # => False
' '.IsNullOrWhiteSpace() # => True