Làm cách nào để kiểm tra xem một chuỗi có rỗng hay trống trong PowerShell không?


413

Có một IsNullOrEmptyhàm giống như được tích hợp sẵn để kiểm tra xem một chuỗi có rỗng hay không, trong PowerShell?

Tôi không thể tìm thấy nó cho đến nay và nếu có một cách tích hợp, tôi không muốn viết một chức năng cho việc này.



8
Vâng, bạn đang sử dụng .NET, vì vậy bạn không thể gọi String.IsNullOrEmpty?
Jon Skeet

Câu trả lời:


471

Bạn có thể sử dụng IsNullOrEmptyphương thức tĩnh:

[string]::IsNullOrEmpty(...)

3
Tôi thích cách này hơn vì nó rõ ràng là những gì nó làm bất kể kiến ​​thức Powerhsell của bạn - điều này sẽ có ý nghĩa đối với các lập trình viên không phải là Powershell.
bút chì Làm

18
Tôi đoán bạn chỉ có thể làm! $ Var
Shay Levy

4
Một điều cần chú ý với PowerShell là các chuỗi null được truyền cho một tập lệnh hoặc hàm không giữ nguyên giá trị. Họ được chuyển đổi thành chuỗi rỗng. Xem lỗi Microsoft Connect tại connect.microsoft.com/PowerShell/feedback/details/861093/ mẹo .
JamieSee

25
Xem xét [Chuỗi] :: IsNullOrWhiteSpace (...) để xác thực các khoảng trống.
Sai

3
@ShayLevy Cẩn thận với !. Điều đó chỉ hoạt động trong các phiên bản mới hơn của PowerShell. !là bí danh cho-not
Kolob Canyon

598

Các bạn đang làm điều này quá khó. PowerShell xử lý việc này khá thanh lịch, ví dụ:

> $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
@ppsonCake Vâng, đó là những gì tôi đang nói và ví dụ trên cho thấy nó hoạt động. Cái mà bài kiểm tra sẽ không kiểm tra là IsNullOrWhitespace ().
Keith Hill

3
Tôi đồng ý với giải pháp này tốt hơn từ quan điểm kịch bản. Như mọi khi, Keith Hill có giải pháp chính xác! Cảm ơn.
Vippy

2
Bạn nói thanh lịch, nhưng vì một số lý do, điều này cảm thấy giống như JS.
Dan Atkinson

2
@VertigoRay Xem bình luận đầu tiên của tôi ở trên nơi tôi khuyên bạn nên sử dụng IsNullOrWhitespace()cho kịch bản đó. Nhưng sau 11 năm kịch bản với PowerShell, tôi thấy tôi cần mà kiểm tra chuỗi rất hiếm . :-)
Keith Hill

3
"KeithHill. Xin lỗi, điều đó vẫn không an toàn, vì ý định của bạn không rõ ràng. Khi bạn sử dụng [chuỗi] :: IsNullOrEmpty, bạn hoàn toàn rõ ràng. IMO, Powershell là một sáng tạo kỳ lạ - hầu hết thời gian nó rất phong phú, nhưng vẫn thiếu các yếu tố cần thiết. -isNullOrEmpty là một trong số đó ...
dmitry

40

Ngoài việc [string]::IsNullOrEmptyđể kiểm tra null hoặc rỗng, bạn có thể truyền một chuỗi thành Boolean một cách rõ ràng hoặc trong các biểu thức Boolean:

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

Đầu ra:

False
string is null or empty

False
string is null or empty

True
string is not null or empty

4
Điểm hay. Ifmệnh đề bên trong chuyển đổi mọi thứ bên trong dấu ngoặc đơn thành boolean đơn có nghĩa là if($string){Things to do for non-empty-nor-null}hoặc if(!$string){Things to do for empty-or-null}không có chuyển đổi rõ ràng [bool]là đủ.
Ch.Idea

20

Nếu nó là một tham số trong hàm, bạn có thể xác thực nó ValidateNotNullOrEmptynhư bạn có thể thấy trong ví dụ này:

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

    #stuff todo
}

10

Cá nhân, tôi không chấp nhận một khoảng trắng ($ STR3) là 'không trống'.

Khi một biến chỉ chứa khoảng trắng được truyền vào một tham số, thông thường sẽ có lỗi là giá trị tham số có thể không phải là '$ null', thay vì nói nó có thể không phải là khoảng trắng, một số lệnh xóa có thể xóa thư mục gốc thay vì thư mục con nếu tên thư mục con là "khoảng trắng", tất cả lý do không chấp nhận một chuỗi chứa khoảng trắng trong nhiều trường hợp.

Tôi thấy đây là cách tốt nhất để hoàn thành nó:

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

Trống

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

Trống

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

Trống!! :-)

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

Không trống


5

Tôi có tập lệnh PowerShell Tôi phải chạy trên máy tính vì vậy nó không có [Chuỗi] :: IsNullOrWhiteSpace (), vì vậy tôi đã tự viết.

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

Thay thế PowerShell 2.0 cho [string]::IsNullOrWhiteSpace()string -notmatch "\S"

(" \ S " = bất kỳ ký tự không phải khoảng trắng nào)

> $null  -notmatch "\S"
True
> "   "  -notmatch "\S"
True
> " x "  -notmatch "\S"
False

Hiệu suất rất gần:

> Measure-Command {1..1000000 |% {[string]::IsNullOrWhiteSpace("   ")}}
TotalMilliseconds : 3641.2089

> Measure-Command {1..1000000 |% {"   " -notmatch "\S"}}
TotalMilliseconds : 4040.8453

1

Một cách khác để thực hiện điều này theo cách PowerShell thuần túy là làm một việc như thế này:

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

Điều này đánh giá thành công cho null, chuỗi rỗng và khoảng trắng. Tôi định dạng giá trị được truyền vào một chuỗi rỗng để xử lý null (nếu không, null sẽ gây ra lỗi khi Trim được gọi). Sau đó, chỉ cần đánh giá bình đẳng với một chuỗi rỗng. Tôi nghĩ rằng tôi vẫn thích IsNullOrWhiteSpace, nhưng nếu bạn đang tìm kiếm một cách khác để làm điều đó, nó sẽ hoạt động.

$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

Trong một sự nhàm chán, tôi đã chơi với một số thứ này và làm cho nó ngắn hơn (mặc dù khó hiểu hơn):

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

hoặc là

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

tùy thuộc vào những gì bạn đang cố gắng làm.


1

Lưu ý rằng "if ($str)""IsNullOrEmpty"các bài kiểm tra không hoạt động tương đương trong tất cả các trường hợp: một bài tập $str=0tạo ra sai cho cả hai và tùy thuộc vào ngữ nghĩa chương trình dự định, điều này có thể gây bất ngờ.


$ str = 0 không phải là một thực hành mã hóa tốt. $ str = '0' sẽ không còn nghi ngờ gì về kết quả mong đợi của IsNullOrEmpty.
dmitry

-1

Kiểm tra độ dài. Nếu đối tượng tồn tại, nó sẽ có chiều dài.

Các đối tượng Null không có chiều dài, không tồn tại và không thể được kiểm tra.

Đối tượng chuỗi có độ dài.

Câu hỏi là: IsNull hoặc IsEmpty, KHÔNG IsNull hoặc IsEmpty hoặc 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- bạn đã thử thực hiện $null.lengthchưa? :-) Đối với thử nghiệm bool nhanh, chuyển sang Get-Member và sau đó phải xử lý lỗi kết quả cho trường hợp $ null có vẻ hơi nặng đối với tôi.
Keith Hill
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.