programing

PowerShell에서 문자열이 null인지 빈지 확인하는 방법은 무엇입니까?

padding 2023. 4. 8. 08:01
반응형

PowerShell에서 문자열이 null인지 빈지 확인하는 방법은 무엇입니까?

★★★★★★★★★★★★★★★★★★★★★?IsNullOrEmptyPowerShell 서인인 인인null 인 power power power power power power?

아직 찾을 수 없고, 내장 방법이 있다면 이 함수는 쓰고 싶지 않습니다.

너무 힘들게 하는 거 아니야?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

.IsNullOrEmpty다음 중 하나:

[string]::IsNullOrEmpty(...)

★★★★★★★★★★★★★★★★ [string]::IsNullOrEmpty 빈 을 부울에 할 수 있습니다.

$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

할 수 .ValidateNotNullOrEmpty에서 알 수 : " " " 입니다.

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

    #stuff todo
}

개인적으로는 공백($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'}

비어 있지 않다

2.0을 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 스크립트가 있어 [String]이(가): Is NullOrWhiteSpace ( )그래서 제가 직접 썼어요.

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

여기에서는 적절한 답변이 많이 제시되어 있습니다.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'  
  • string-only 연산자를 사용하면 LHS가 스트링에 암묵적으로 강제됩니다.[string] $null 다 빈합니다.'' -like '' ★★★★★★★★★★★★★★★★★」$null -like ''$true.

  • 마찬가지로 regex 기반 / 연산자는 문자열 전용 연산자로서 LHS 피연산자를 문자열로 강제합니다.$null을 받다''변の변

    • \S는 공백 이외의 임의의 문자와 일치하는 정규식 이스케이프 시퀀스입니다(이 형식은\s를 참조해 주세요.

    • -match-notmatch디폴트로 서브스트링 조회를 실행(및 일치하는 것은1개만 반환)하기 때문에,\S합니다.


경고:

PowerShell의 동적 입력으로 인해 지정된 변수에 저장된 값의 유형을 미리 알지 못할 수 있습니다.

은 '할 수 있는 이지만,$null,[string]인스턴스 및 기타 타입은 열거할 수 없고 열거할 수 없는 값(문자열 제외)이 놀라운 결과를 얻을 수치의 LHS가-like ★★★★★★★★★★★★★★★★★」-notmatchare enumerable(간단히 말하면 collections)은 각 요소에 적용되며 단일 부울 값을 반환하는 대신 일치하는 요소의 서브 배열이 반환됩니다.

조건의 맥락에서 배열이 부울로 강제되는 방법은 다소 반직관적입니다. 배열에 요소가 하나만 있는 경우 해당 요소 자체가 부울로 강제됩니다. 두 개 이상의 요소가 있는 경우 배열은 항상 부울로 강제됩니다.$true요소 값에 관계없이 이 답변의 아래쪽 섹션을 참조하십시오.예:

# -> 'why?', because @('', '') -like '' yields @('', ''), which
# - due to being a 2-element array - is $true
$var = @('', '')
if ($var -like '') { 'why?' }

문자열이 아닌 열거형 LHS를 에 캐스팅하면 PowerShell은 해당(문자열화된) 요소를 공백으로 연결하여 문자열화합니다.이 또한 당신이 전화했을 때 암묵적으로 일어나는 일입니다.[string]::IsNullOrEmpty() ★★★★★★★★★★★★★★★★★」[string]::IsNullOrWhiteSpace()이기 [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'  
# 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 방식으로 이를 실현하는 또 다른 방법은 다음과 같습니다.

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

이 값은 null, 빈 문자열 및 공백에 대해 정상적으로 평가됩니다.전달된 값의 형식을 빈 문자열로 지정하여 null을 처리하고 있습니다(그렇지 않으면 trim을 호출할 때 null로 인해 오류가 발생합니다).그럼 그냥 빈 문자열로 평등을 평가하세요.난 여전히 Is Nullor가 더 좋은 것 같아WhiteSpace, 하지만 다른 방법을 찾고 있다면 이 방법을 사용할 수 있습니다.

$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())

네가 뭘 하려고 하는가에 따라.

@Keith와의 접선 결점 해결Hill의 답변은 이 문제를 다루지 않습니다.PowerShell 7.1 이후에서는 늘 조건의 멤버 연산자를 사용하여 문자열이 늘인지 공백인지를 먼저 확인할 필요 없이 정상적으로 확인할 수 있습니다.$null)의 을 [string]::IsNullOrWhitespace(string).

주의: PowerShell 7.0에서도 이 작업을 수행할 수 있습니다.PSNullConditionalOperators험험: :

Enable-ExperimentalFeature -Name PSNullConditionalOperators

「 」를 $str3Keith의 답변에서 예제를 참조하십시오(명확성을 위해 7.0 이후로는 3진 연산자가 존재하지 않는 것처럼 가장함).

$str3 = ' '
if ( ${str3}?.Trim() ) {
  'not empty or whitespace'
} else {
  'empty or whitespace'
}
empty or whitespace

.Trim() 호출되는 것은, 「」의 경우 입니다.$str3 않으면 '비표준값'입니다.그렇지 않으면$null대신 반환됩니다.


은 물음표입니다.?는 변수 이름의 일부로 유효합니다.따라서 다음과 같이 조건부 액세스 연산자를 적용하기 전에 먼저 변수 이름을 명확히 해야 합니다.${str3}


앞에서 삼진 연산자에 대해 언급했으므로 이 답변은 이미 PowerShell 7.1 이후를 중심으로 하고 있으므로 삼진 연산자를 사용하여 위의 코드 블록을 단순화할 수 있습니다.보일러 플레이트를 제거합니다.if/then/else「 」 「 」 :

${str3}?.Trim() ? 'not empty or whitespace' : 'empty or whitespace'

3진 연산자는 단순화된 연산자입니다.if/then/else기본 조건의 문.미묘한 뉘앙스로 이 상황을 너무 혼란스럽게 만들고 싶지는 않지만, "만약 외로운 물음표의 왼쪽이? 한다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★? 콜론 것을 :

3진 연산자에 대한 자세한 내용은 PowerShell 설명서를 참조하십시오.

, 하다, 하다, 하다, 하다, 할 수 요.IsNullOrWhitespace() ★★★★★★★★★★★★★★★★★」isNullOrEmpty()공백 또는 늘 값을 테스트하는 정적 메서드입니다.를 들어, 에 에, 에 삽입해 주세요.MySQL입력할 값을 루프하고 null 또는 공백 값을 피하기 위해 조건을 사용합니다.

// 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 -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

빈 문자열을 null로 변환하는 필터를 작성할 수 있습니다.이 경우 null만 체크하면 됩니다.

filter nullif {@($_, $null)[$_ -eq '']}

그럼 네 가치를 거기에 담기만 하면 돼

('' | nullif) -eq $null
> True
('x' | nullif) -eq $null
> False

더 쉬운 mrthod는 정규식을 사용하는 것입니다.

$null -match '^$'
> True
'' -match '^$'
> True
'x' -match '^$'
> False

Keith Hill의 답변 확장(공백 설명):

$str = "     "
if ($str -and $version.Trim()) { Write-Host "Not Empty" } else { Write-Host "Empty" }

공백이 있는 null, 빈 문자열 및 문자열의 경우 "Empty"를 반환하고 다른 모든 문자열의 경우 "Not Empty"를 반환합니다.

언급URL : https://stackoverflow.com/questions/13738634/how-can-i-check-if-a-string-is-null-or-empty-in-powershell

반응형