如何在PowerShell中检查字符串是空还是空?

时间:2012-12-06 07:09:29

标签: .net string powershell null

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

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

13 个答案:

答案 0 :(得分:523)

你们这样做太难了。 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

答案 1 :(得分:391)

您可以使用IsNullOrEmpty静态方法:

[string]::IsNullOrEmpty(...)

答案 2 :(得分:36)

除了[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

答案 3 :(得分:17)

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

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

    #stuff todo
}

答案 4 :(得分:9)

就我个人而言,我不接受空白($ 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 :(得分:5)

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

printf("%ld",l)

答案 6 :(得分:3)

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

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

答案 7 :(得分:1)

请注意,"if ($str)""IsNullOrEmpty"测试在所有实例中都不相同:$ str = 0的赋值会对两者产生错误,并且取决于预期的程序语义,可能会产生惊喜。

答案 8 :(得分:1)

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

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

取决于您尝试做什么。

答案 9 :(得分:1)

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

get-clipboard | ? {$_}

答案 10 :(得分:0)

[string]::IsNullOrWhiteSpace()的PowerShell 2.0替换为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

答案 11 :(得分:0)

对Keith Hill答案的扩展(以解决空白):

class Node {
    constructor(value) {
        this.value = value;
        this.prev = new Set;
        this.order = 0; // No order yet
    }
    orderWith(other) {
        if (other === this) return;
        if (a_before_b(this.value, other.value) || b_before_a(other.value, this.value)) {
            other.prev.add(this);
        } else if (a_before_b(other.value, this.value) || b_before_a(this.value, other.value)) {
            this.prev.add(other);
        }
    }
    setOrder(path = new Set) {
        // Use recursion to find length of longest path to "least" node.
        if (this.order) return; // already done
        if (path.has(this)) throw "cycle detected";
        let order = 1;
        for (let prev of this.prev) {
            prev.setOrder(path.add(this));
            order = Math.max(order, prev.order + 1);
        }
        this.order = order; // If order is 1, it is a "least" node
    }
}

const a_before_b = (a, b) => {
  if (a == 'a' && b == 'd') return true;
  if (a == 'b' && b == 'c') return true;
}

const b_before_a = (a, b) => {
  if (b == 'a' && a == 'c') return true;
  if (b == 'b' && a == 'c') return true;
}

function mySort(arr) {
    // Create a graph: first the nodes
    let nodes = {}; // keyed by values in arr
    for (let value of arr) nodes[value] = nodes[value] || new Node(value);

    // Then the edges...
    for (let i = 0; i < arr.length; i++) {
        for (let j = i+1; j < arr.length; j++) {
            nodes[arr[i]].orderWith(nodes[arr[j]]);
        }
    }
    
    // Set absolute order, using the longest path from a node to a "least" node.
    for (let node of Object.values(nodes)) node.setOrder();
    
    // Sort array by order:
    return arr.sort((a, b) => nodes[a].order - nodes[b].order);
}

const sorted = ['a', 'b', 'c', 'd'];
const unsorted = ['c', 'd', 'a', 'b'];
console.log(mySort(unsorted));

对于空值,空字符串和带空格的字符串,这将返回“空”,对于其他所有内容,将返回“不为空”。

答案 12 :(得分:-1)

检查长度。如果对象存在,则它将具有长度。

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

String对象有一个长度。

问题是:IsNull或IsEmpty,Not 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