यदि किसी वस्तु की विशिष्ट संपत्ति है तो आप कैसे परीक्षण कर सकते हैं?


93

यदि किसी वस्तु की विशिष्ट संपत्ति है तो आप कैसे परीक्षण कर सकते हैं?

सराहना मैं कर सकता हूँ ...

$members = Get-Member -InputObject $myobject 

और फिर के foreachमाध्यम से$members , लेकिन क्या कोई परीक्षण करने के लिए फ़ंक्शन है यदि ऑब्जेक्ट के पास एक विशिष्ट संपत्ति है?

अतिरिक्त जानकारी: मुद्दा यह है कि मैं दो अलग-अलग प्रकार के CSV फ़ाइल आयात कर रहा हूं, एक दो कॉलम के साथ, दूसरा तीन के साथ। मुझे "प्रॉपर्टी" के साथ काम करने के लिए चेक नहीं मिला, केवल "नोटप्रॉपर्टी" के साथ ... जो भी अंतर है

if ( ($member.MemberType -eq "NoteProperty" ) -and ($member.Name -eq $propertyName) ) 

6
($object.property -ne $null)?
arco444

2
क्या इससे कोई फर्क नहीं पड़ता कि क्या उचित मौजूद है, लेकिन इसका एक $nullमूल्य है
मैट

1
@ arco444 nope - जिसके लिए संपत्ति को सफल होने के लिए मौजूद होना आवश्यक है। - यदि आपके पास डायनेमिक डेटा (यानी वेब रिक्वेस्ट से) जहां कुछ पंक्तियां उस संपत्ति को भी निर्दिष्ट नहीं करती हैं, तो वह चेक विफल हो जाएगा। :(
BrainSlugs83

जवाबों:


103

इस कदर?

 [bool]($myObject.PSobject.Properties.name -match "myPropertyNameToTest")

16
यह उत्तर केवल PowerShell v3 या उच्चतर के लिए काम करता है। निम्नलिखित को PowerShell v2 और इसके बाद के संस्करण के साथ भी काम करना चाहिए: [बूल] ($ file.psobject.Properties | जहाँ {$ _। नाम -eq "myPropertyNameToTest"})
पैट्रिक

33
$myObject.PSobject.Properties.Name -contains "myPropertyNameToTest"बेहतर है। मिलान के संभावित पैटर्न के बारे में चिंता करने की कोई आवश्यकता नहीं है, और आपको या तो बुलियन को डालने की आवश्यकता नहीं होगी।
बेकन बिट्स

2
क्या होगा यदि वस्तु के पास संपत्ति है ThisisMyPropertyऔर आप उसकी जांच करना चाहते हैं MyProperty? इस उत्तर के सभी समाधानों के परिणामस्वरूप एक गलत सकारात्मक परिणाम आएगा।
ज़ोल्टन तमसी

3
@KolobCanyon स्ट्रिक्ट मोड के तहत काम नहीं करेगा।
user2864740

1
यह कोड एक गलत सकारात्मक देगा यदि उदाहरण के लिए आप "काउंट" के लिए परीक्षण करते हैं और ऑब्जेक्ट में "थिंगकाउंट" नामक एक संपत्ति थी।
दान-gph

71

आप उपयोग कर सकते हैं Get-Member

if(Get-Member -inputobject $var -name "Property" -Membertype Properties){
#Property exists
}

12
सबसे अच्छा जवाब IMHO। यह .NET ऑब्जेक्ट्स के साथ काम करता है जिसमें PSobject सदस्य नहीं है। यदि हम इस बात का ध्यान नहीं रखते हैं कि हम किस प्रकार के सदस्य को शामिल करते हैं - केवल सदस्य का नाम। Invoke-RestMethod या ConvertFrom-Json वस्तुओं के साथ बहुत उपयोगी!
Mister_Tom

2
बिना किसी प्रकार की जाँच के लघु वाक्य रचना: if($var | Get-Member Property){ }इससे भी छोटी लेकिन कम पठनीय:if($var | gm Property){ }
zett42

यह मेरी राय में सबसे अच्छा जवाब है।
किरण हेगड़े

25

यह संक्षिप्त और पठनीय है:

"MyProperty" -in $MyObject.PSobject.Properties.Name

हम इसे एक समारोह में रख सकते हैं:

function HasProperty($object, $propertyName)
{
    $propertyName -in $object.PSobject.Properties.Name
}

मुझे यह उत्तर पसंद है, लेकिन यह उन मामलों में काम नहीं करता है जहां सीबी का जवाब है।
एडविन

या, जहाँ "सक्सेसफुल" = "बेवजह कबाड़ को स्ट्रिक्ट मोड के माध्यम से एक अच्छे कमबैक यूसेज केस के बिना पेश किया गया" (यानी। कोई ?.समतुल्य नहीं ): | यह निश्चित $MyObjectरूप से $ n की भिन्नताओं के लिए भी विफल होगा । स्ट्रिक्ट मोड के बाहर नल-चेनिंग के साथ ऐसा नहीं था।
user2864740

5

मैं निम्नलिखित का उपयोग कर रहा हूं जो संपत्ति के मूल्य को लौटाता है, क्योंकि इसके माध्यम से एक्सेस किया जाएगा$thing.$prop , अगर "संपत्ति" मौजूद होगी और यादृच्छिक अपवाद नहीं फेंकेगी। यदि संपत्ति "अस्तित्व में नहीं है" (या एक अशक्त मूल्य है) तो $nullवापस कर दिया जाता है: यह दृष्टिकोण / कार्य सख्त मोड के लिए उपयोगी है , क्योंकि, ठीक है, उन्हें पकड़ो।

मुझे यह दृष्टिकोण उपयोगी लगता है क्योंकि यह PS कस्टम ऑब्जेक्ट्स, सामान्य .NET ऑब्जेक्ट्स, PS हैशटेबल्स, और .NET संग्रह जैसे डिक्शनरी को "डक-टंकित समकक्ष" के रूप में माना जाता है। , जो मुझे लगता है कि यह PowerShell के लिए काफी अच्छा फिट है।

बेशक, यह "एक संपत्ति है" की सख्त परिभाषा को पूरा नहीं करता है .. जो कि यह प्रश्न स्पष्ट रूप से सीमित हो सकता है। यदि यहां मान ली गई "संपत्ति" की बड़ी परिभाषा को स्वीकार करते हुए, बूलियन वापस करने के लिए विधि को तुच्छ रूप से संशोधित किया जा सकता है।

Function Get-PropOrNull {
    param($thing, [string]$prop)
    Try {
        $thing.$prop
    } Catch {
    }
}

उदाहरण:

Get-PropOrNull (Get-Date) "Date"                   # => Monday, February 05, 2018 12:00:00 AM
Get-PropOrNull (Get-Date) "flub"                   # => $null
Get-PropOrNull (@{x="HashTable"}) "x"              # => "HashTable"
Get-PropOrNull ([PSCustomObject]@{x="Custom"}) "x" # => "Custom"
$oldDict = New-Object "System.Collections.HashTable"
$oldDict["x"] = "OldDict"
Get-PropOrNull $d "x"                              # => "OldDict"

और, इस व्यवहार को [हमेशा] वांछित नहीं किया जा सकता है। x.Countऔर के बीच अंतर करना संभव नहीं है x["Count"]


3

मेरे लिए MyProperty" -in $MyObject.PSobject.Properties.Nameहालांकि काम नहीं किया

$MyObject.PSobject.Properties.Name.Contains("MyProperty")

काम करता है


2

यदि आप StrictMode का उपयोग कर रहे हैं और psobject खाली हो सकता है, तो यह आपको एक त्रुटि देगा।

सभी उद्देश्यों के लिए यह करेगा:

    if (($json.PSobject.Properties | Foreach {$_.Name}) -contains $variable)

1

जावास्क्रिप्ट चेक के समान वास्तविक:

foreach($member in $members)
{
    if($member.PropertyName)
    {
        Write $member.PropertyName
    }
    else
    {
        Write "Nope!"
    }
}

1
यह काम नहीं कर सकता है यदि संपत्ति में वास्तव में मूल्य $ null है।
तोला ओडजायि

8
यदि PowerShell सख्त मोड में है, तो यह विफल हो जाएगा।
इयान केम्प

@IanKemp सख्त मोड क्या है? निष्पादन नीति की तरह?
कोलोब कैन्यन

1
@KolobCanyon docs.microsoft.com/en-za/powershell/module/… - अनिवार्य रूप से यह जावास्क्रिप्ट के बराबर PS है use strict
इयान केम्प

1
यह भी काम नहीं करेगा यदि संपत्ति मौजूद है, और $ झूठी पर सेट है।

1

बस निम्नलिखित वस्तु को स्पष्ट करने के लिए

$Object

निम्नलिखित गुणों के साथ

type        : message
user        : john.doe@company.com
text        : 
ts          : 11/21/2016 8:59:30 PM

निम्नलिखित सत्य हैं

$Object.text -eq $NULL
$Object.NotPresent -eq $NULL

-not $Object.text
-not $Object.NotPresent

तो पहले वाले जवाब जो स्पष्ट रूप से नाम से संपत्ति की जांच करते हैं, यह सत्यापित करने का सबसे सही तरीका है कि संपत्ति मौजूद नहीं है।


1

बस अशक्त के खिलाफ जाँच करें।

($myObject.MyProperty -ne $null)

यदि आपने स्ट्रक्टमोड पर पावरशेल सेट नहीं किया है , तो यह संपत्ति के मौजूद न होने पर भी काम करता है:

$obj = New-Object PSObject;                                                   
Add-Member -InputObject $obj -MemberType NoteProperty -Name Foo -Value "Bar";
$obj.Foo; # Bar                                                                  
($obj.MyProperty -ne $null);  # False, no exception

2
जहां तक ​​मैं देख सकता हूं, यह काम करता है अगर संपत्ति मौजूद है और $ null है, लेकिन ऐसा नहीं है कि अगर संपत्ति मौजूद नहीं है - यह करने के लिए उपयोग करने का प्रयास करने के लिए नल की जांच एक अपवाद फेंकता है।
पीटर

@ पैटर क्या आप संपत्ति की मौजूदगी नहीं होने पर एक अपवाद फेंकने वाले नल चेक का एक उदाहरण प्रदान कर सकते हैं। मैंने एक उदाहरण जोड़ा है जिसमें कोई संपत्ति मौजूद नहीं है और कोई अपवाद नहीं है।
शॉन लुटिन

2
इसे चलाएं: Set-Strictmode -version Latest;$obj = ConvertFrom-Json -InputObject '{"name":"test", "version":"1.1.0"}';If($obj.StartDate -ne $null){Write-Verbose -Message $obj.startDate -Verbose}और आपको एक त्रुटि मिलेगी संपत्ति 'प्रारंभ' इस ऑब्जेक्ट पर नहीं मिल सकती है। हालाँकि मुझे अपनी टिप्पणी को योग्य बनाने की आवश्यकता है - यदि स्ट्रिक्टमोड सेट नहीं है, तो आप इसे प्राप्त नहीं करते हैं। मैंने हमेशा इसे सेट किया है, इसलिए जब तक मैंने इसके लिए परीक्षण नहीं किया, तब तक इसका एहसास नहीं हुआ! फिर भी, मुझे लगता है कि ज्यादातर लोग 'सेट-स्ट्रिक्टमोड' का उपयोग करते हैं (या उपयोग करना चाहिए)।
पीटर

2
शायद सबसे अच्छा अगर आप अपने जवाब को योग्य करते हैं, और मैं अपना पद छोड़ दूंगा? हर किसी ने कुछ सीखा है, जो बिंदु :-)
पीटर

0

मैं निम्नलिखित समारोह के साथ समाप्त हुआ ...

function HasNoteProperty(
    [object]$testObject,
    [string]$propertyName
)
{
    $members = Get-Member -InputObject $testObject 
    if ($members -ne $null -and $members.count -gt 0) 
    { 
        foreach($member in $members) 
        { 
            if ( ($member.MemberType -eq "NoteProperty" )  -and `
                 ($member.Name       -eq $propertyName) ) 
            { 
                return $true 
            } 
        } 
        return $false 
    } 
    else 
    { 
        return $false; 
    }
}

0

मैं हाल ही में सख्त-मोड -version 2.0 को सेट करने के लिए स्विच कर रहा हूं और मेरे नल परीक्षण विफल हो गए।

मैंने एक फ़ंक्शन जोड़ा:

#use in strict mode to validate property exists before using
function exists {
  param($obj,$prop)
  try {
    if ($null -ne $obj[$prop]) {return $true}
    return $false
  } catch {
    return $false
  }
  return $false
}

अब मैं कोड करता हूं

if (exists $run main) { ...

बजाय

if ($run.main -ne $null) { ...

और हम अपने रास्ते पर हैं। वस्तुओं और हैशटैब पर काम करने लगता है

अनपेक्षित लाभ के रूप में यह कम टाइपिंग है।


अशक्त या खाली होने के लिए, मैंने हमेशा उपयोग किया है: IF ([string] :: IsNullOrEmpty ($ userID)) {राइट-होस्ट "Null या खाली"}

-1

मैंने अभी PowerShell Core 6.0 (बीटा) के साथ PowerShell का उपयोग करना शुरू किया और बस काम करता है:

if ($members.NoteProperty) {
   # NoteProperty exist
}

या

if (-not $members.NoteProperty) {
   # NoteProperty does not exist
}

1
स्ट्रेटमोड पर नहीं
कैस्पर लियोन नीलसन

-1

आप इसके साथ देख सकते हैं:

($Member.PropertyNames -contains "Name") यह नामांकित संपत्ति के लिए जाँच करेगा


-1

यह पहचानने के लिए कि किसी सरणी में कौन सी वस्तु है

$HasProperty = $ArrayOfObjects | Where-Object {$_.MyProperty}

जब संपत्ति मौजूद नहीं है तो स्ट्रिक्टमोड में विफल रहता है।
user2864740
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.