কোনও বস্তুর নির্দিষ্ট সম্পত্তি থাকলে আপনি কীভাবে পরীক্ষা করতে পারেন?


97

কোনও বস্তুর নির্দিষ্ট সম্পত্তি থাকলে আপনি কীভাবে পরীক্ষা করতে পারেন?

আমি করতে পারি প্রশংসা ...

$members = Get-Member -InputObject $myobject 

এবং তারপর foreachমাধ্যমে $members, কিন্তু পরীক্ষা করার জন্য একটি ফাংশন যদি বস্তুর একটি নির্দিষ্ট সম্পত্তি আছে?

অতিরিক্ত তথ্য: সমস্যাটি হ'ল আমি দুটি ভিন্ন ধরণের সিএসভি ফাইল আমদানি করছি, একটিতে দুটি কলাম, অন্যটি তিনটি দিয়ে। "সম্পত্তি" দিয়ে কাজ করার জন্য আমি চেকটি পাইনি, কেবল "নোটপ্রোপার্টি" দিয়ে ... পার্থক্য যাই হোক না কেন

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

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

4
প্রাইটির উপস্থিতি থাকলেও তার কোনও $nullমূল্য আছে কিনা তা বিবেচনা করে
ম্যাট

4
@ আরকো 444 না - এটি সফল হওয়ার জন্য সম্পত্তিটির অস্তিত্ব থাকা প্রয়োজন। - আপনার যদি ডায়নামিক ডেটা থাকে (যেমন কোনও ওয়েব অনুরোধ থেকে) যেখানে কয়েকটি সারি এমনকি সেই বৈশিষ্ট্যটি নির্দিষ্ট করে না, সেই চেকটি ব্যর্থ হবে। :(
BrainSlugs83

উত্তর:


107

এটার মত?

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

16
এই উত্তরটি কেবল পাওয়ারশেল v3 বা ততোধিকের জন্য কাজ করে। নীচে পাওয়ারশেল ভি 2 এবং এর উপরেও কাজ করা উচিত: [bool] ($ file.psobject.Properties | যেখানে {$ _। নাম -eq "myPropertyNameToTest"})
প্যাট্রিক

35
$myObject.PSobject.Properties.Name -contains "myPropertyNameToTest"ভাল. সম্ভাব্য প্যাটার্ন মিলের বিষয়ে চিন্তা করার দরকার নেই এবং আপনার তখন বুলিয়ানে কাস্ট করার প্রয়োজন হবে না।
বেকন বিট 19

4
কি যদি বস্তুর সম্পত্তি থাকে ThisisMyPropertyএবং আপনি যাচাই করতে চান MyProperty? এই উত্তরের সমস্ত সমাধানের ফলে একটি মিথ্যা ইতিবাচক ফলাফল আসবে।
জোল্টন

4
@ কলবক্যানিয়ন এটি স্ট্রাইক মোডের অধীনে কাজ করবে না।
ব্যবহারকারী 2864740

4
এই কোডটি একটি মিথ্যা পজিটিভ দিবে যদি উদাহরণস্বরূপ আপনি যেখানে "গণনা" এবং পরীক্ষার জন্য পরীক্ষার যেখানে "থিংকাউন্ট" নামক সম্পত্তি রয়েছে।
ড্যান-জিএফ

73

তুমি ব্যবহার করতে পার Get-Member

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

12
সেরা উত্তর আইএমএইচও। এটি .NET অবজেক্টের সাথে কাজ করে যাগুলির PSobject সদস্য নেই। বস্তুটি কোন ধরণের সদস্যের পরিচয় রাখে না - আমরা কেবল সদস্য নামটিও আমরা -Membertype বিকল্পটি সরাতে পারি। ইনভোক-রেস্টমথোড বা কনভার্টফর্ম-জসন অবজেক্টের সাথে খুব দরকারী!
মিস্টার_টম

4
প্রকার পরীক্ষা না করে সংক্ষিপ্ত বাক্য গঠন: if($var | Get-Member Property){ }এমনকি ছোট এমনকি কম পাঠযোগ্য:if($var | gm Property){ }
zett42

এটি আমার মতে সেরা উত্তর।
কিরণ হেগডে 24'20

27

এটি সংক্ষিপ্ত এবং পঠনযোগ্য:

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

আমরা এটি একটি ফাংশনে রাখতে পারি:

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

আমি এই উত্তরটি ভালবাসি, তবে মনে হয় সিবি-র উত্তরটি এমন কিছু ক্ষেত্রে কার্যকর হয় না।
এডউইন

বা, যেখানে "succinct" = "ভাল ফ্যালব্যাক ব্যবহারের ক্ষেত্রে ছাড়াই স্ট্রাইক মোডের মাধ্যমে অপ্রয়োজনীয় জাঙ্ক প্রবর্তন করা হয়েছে" (অর্থাত্ কোনও ?.সমতুল্য নয়): | এটি নির্দিষ্ট কিছু পরিবর্তনের জন্যও ব্যর্থ হবে $MyObject, বিশেষত ull নাল। স্ট্রাইক মোডের বাইরে নাল-চেইন করার ক্ষেত্রে এটি ছিল না।
ব্যবহারকারী 2864740

5

আমি নিম্নলিখিতটি ব্যবহার করছি যা সম্পত্তি মানটি প্রদান করে, যেমন এটির মাধ্যমে অ্যাক্সেস করা হত$thing.$prop , যদি "সম্পত্তি" বিদ্যমান থাকে এবং এলোমেলো ব্যতিক্রম না ছুঁড়ে দেয়। সম্পত্তিটি যদি "অস্তিত্বহীন" থাকে (বা তার নাল মান থাকে) তবে $nullতা ফেরত দেওয়া হয়: এই পদ্ধতির মধ্যে / কঠোর মোডের জন্য দরকারী , কারণ, ভাল, গন ক্যাচ 'এম সব।

আমি এই পদ্ধতিকে দরকারী বলে মনে করি কারণ এটি পিএস কাস্টম অবজেক্টস, স্বাভাবিক .NET অবজেক্টস, পিএস হ্যাশটবেবলস এবং। NET সংগ্রহগুলি অভিধানের মতো "হাঁস-টাইপ সমতুল্য" হিসাবে বিবেচনা করে , যা আমি পাই পাওয়ারশেলের জন্য মোটামুটি উপযুক্ত।

অবশ্যই, এটি "একটি সম্পত্তি আছে" এর কঠোর সংজ্ঞা মেলে না .. যা এই প্রশ্নটি স্পষ্টভাবে সীমাবদ্ধ থাকতে পারে। যদি এখানে ধরে নেওয়া "সম্পত্তি" এর বৃহত্তর সংজ্ঞা গ্রহণ করে তবে একটি বুলিয়ান ফেরত দেওয়ার জন্য পদ্ধতিটি তুচ্ছভাবে সংশোধন করা যেতে পারে।

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"]


একটি সম্পত্তি বা পেতে $nullঅতিরিক্ত ফাংশন ছাড়া: $x = try{ $someObject.someProp } catch{ $null }। আপনি ব্লক $nullথেকে বাদ দিতে পারেন catch, তবে আইএমও এটি পঠনযোগ্যতা উন্নত করে।
zett42

4

আমার জন্য MyProperty" -in $MyObject.PSobject.Properties.Nameঅবশ্য কাজ হয়নি

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

কাজ করে


2

আপনি যদি স্ট্রাইকমোড ব্যবহার করছেন এবং psobject খালি থাকতে পারে, এটি আপনাকে একটি ত্রুটি দেয়।

সমস্ত উদ্দেশ্যে এটি করবে:

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

1

একটি জাভাস্ক্রিপ্ট চেক অনুরূপ বাস্তব:

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

4
সম্পত্তিটির প্রকৃত মান $ নাল থাকলে এটি কাজ করতে পারে না।
তোলা ওদেજયেই

8
পাওয়ারশেল কঠোর মোডে থাকলে এটি ব্যর্থ হবে।
ইয়ান কেম্প

@ ইয়ানকেম্প- কড়া মোড কি? এক্সিকিউশন পলিসির মতো?
কলব ক্যানিয়ন

4
@ কলবক্যানিয়ন ডকস.মাইক্রোসফটকম / en - za/ powershell / module/ - মূলত এটি জাভাস্ক্রিপ্টের পিএস সমতুল্য use strict
ইয়ান কেম্প

4
সম্পত্তি উপস্থিত থাকলে এবং এটি মিথ্যা হিসাবে সেট করা থাকলে এটিও কাজ করবে না।

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

4
যতদূর আমি দেখতে পাচ্ছি, সম্পত্তিটি বিদ্যমান থাকলে এবং এটি $ নাল হয় তবে এটি কাজ করে, তবে সম্পত্তিটি না থাকলে তা নয় - নাল চেকটি করার জন্য এটি অ্যাক্সেস করার চেষ্টা করা একটি ব্যতিক্রম ছুঁড়ে ফেলে।
পিটার

@ পিটার আপনি সম্পত্তির অস্তিত্ব না থাকলে নাল চেকের একটি ব্যতিক্রম ছুঁড়ে দেওয়ার একটি উদাহরণ সরবরাহ করতে পারেন? আমি একটি উদাহরণ যুক্ত করেছি যাতে কোনও সম্পত্তির অস্তিত্ব নেই এবং এর ব্যতিক্রমও নেই।
শন লুটিন

4
এটি চালান: 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}এবং আপনি একটি ত্রুটি পাবেন এই সম্পত্তিটিতে সম্পত্তি 'স্টার্টডেট' পাওয়া যাবে না। তবে আমার মন্তব্যটি যোগ্য করে তোলা দরকার - স্ট্রাইকমোড সেট না করা থাকলে আপনি তা পাবেন না। আমি সবসময় এটি সেট করে রেখেছি, সুতরাং আমি এর জন্য পরীক্ষা না করা পর্যন্ত কখনই বুঝতে পারি নি! তবুও, আমি মনে করি বেশিরভাগ লোকেরা 'সেট-স্ট্রাইকমোড' ব্যবহার করে (বা ব্যবহার করা উচিত)।
পিটার

4
সম্ভবত আপনার উত্তরটি যোগ্য করে তোলা সবচেয়ে ভাল, এবং আমি আমার ডাউনটাতে সরিয়ে দেব? প্রত্যেকে কিছু না কিছু শিখেছে, যার মূল বিষয় :-)
পিটার

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

আমি সম্প্রতি কঠোর-মোড-রূপান্তর 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) { ...

এবং আমরা আমাদের পথে আছি অবজেক্ট এবং হ্যাশ টেবিলগুলিতে কাজ করার জন্য মনে হচ্ছে

অনিচ্ছাকৃত উপকার হিসাবে এটি টাইপিং কম।


নাল বা খালি জন্য, আমি সর্বদা ব্যবহার করেছি: আইএফ ([স্ট্রিং] :: ইসনুলআরএম্পটি ($ ইউজারআইডি)) {লিখন-হোস্ট "নাল বা খালি"}

-1

আমি কেবল পাওয়ারশেল কোর 6.0 (বিটা) দিয়ে পাওয়ারশেল ব্যবহার শুরু করেছি এবং নিম্নলিখিতগুলি সহজভাবে কাজ করে:

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

বা

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

4
স্ট্রাইকমোড চালু নেই
ক্যাস্পার লিওন নিলসন

-1

আপনি এটি দিয়ে পরীক্ষা করতে পারেন:

($Member.PropertyNames -contains "Name") এটি নামকৃত সম্পত্তিটি পরীক্ষা করবে


-1

অ্যারেতে থাকা কোন বস্তুর একটি সম্পত্তি রয়েছে তা সনাক্ত করার জন্য

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

সম্পত্তি উপস্থিত না থাকলে স্ট্রাইকমোডে ব্যর্থ।
ব্যবহারকারী 2864740
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.