オブジェクトに特定のプロパティがあるかどうかをテストするにはどうすればよいですか?
感謝します...
$members = Get-Member -InputObject $myobject
foreach
を介して$members
を使用しますが、オブジェクトに特定のプロパティがあるかどうかをテストする関数はありますか?
追加情報:問題は、2つの異なる種類のCSVファイルをインポートすることです。1つは2列、もう1つは3列です。 「NoteProperty」でのみ「Property」で動作するようにチェックを取得できませんでした...違いが何であれ
if ( ($member.MemberType -eq "NoteProperty" ) -and ($member.Name -eq $propertyName) )
このような?
[bool]($myObject.PSobject.Properties.name -match "myPropertyNameToTest")
Get-Member
を使用できます
if(Get-Member -inputobject $var -name "Property" -Membertype Properties){
#Property exists
}
これは簡潔で読みやすいです:
"MyProperty" -in $MyObject.PSobject.Properties.Name
関数に入れることができます:
function HasProperty($object, $propertyName)
{
$propertyName -in $object.PSobject.Properties.Name
}
「プロパティ」が存在し、ランダムな例外をスローしない場合は、$thing.$prop
を介してアクセスされるため、がプロパティ値を返す以下を使用しています。プロパティが「存在しない」(またはnull値を持つ)場合、$null
が返されます。このアプローチは、strict modeで機能します。
_/PSカスタムオブジェクト、通常の.NETオブジェクト、PS HashTables、およびディクショナリなどの.NETコレクションを「ダック型の同等物」として扱うことができるため、このアプローチは便利です。パワーシェル。
もちろん、これは「プロパティを持っている」というstrict定義を満たしていません。この質問は明示的に制限されているかもしれません。ここで想定されている「プロパティ」のより大きな定義を受け入れる場合、ブール値を返すようにメソッドを簡単に変更できます。
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"]
を区別することはできません。
StrictModeを使用していて、psobjectが空の場合、エラーが発生します。
すべての目的で、これは次のことを行います。
if (($json.PSobject.Properties | Foreach {$_.Name}) -contains $variable)
Nullをチェックするだけです。
($myObject.MyProperty -ne $null)
PowerShellをStrictModeに設定 がない場合、プロパティが存在しない場合でも機能します。
$obj = New-Object PSObject;
Add-Member -InputObject $obj -MemberType NoteProperty -Name Foo -Value "Bar";
$obj.Foo; # Bar
($obj.MyProperty -ne $null); # False, no exception
Javascriptチェックに類似した実際:
foreach($member in $members)
{
if($member.PropertyName)
{
Write $member.PropertyName
}
else
{
Write "Nope!"
}
}
次のオブジェクトを与えて明確にするために
$Object
次のプロパティを持つ
type : message
user : [email protected]
text :
ts : 11/21/2016 8:59:30 PM
以下は真実です
$Object.text -eq $NULL
$Object.NotPresent -eq $NULL
-not $Object.text
-not $Object.NotPresent
したがって、プロパティを名前で明示的にチェックする以前の回答は、そのプロパティが存在しないことを確認する最も正しい方法です。
配列内のどのオブジェクトにプロパティがあるかを識別するため
$HasProperty = $ArrayOfObjects | Where-Object {$_.MyProperty}
私は次の機能になりました...
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;
}
}
最近、厳格モード-バージョン2.0を設定するように切り替えましたが、nullテストが失敗しました。
関数を追加しました:
#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) { ...
そして、私たちは道を進んでいます。オブジェクトとハッシュテーブルで動作するようです
意図しない利点として、タイピングが少なくなります。
PowerShell Core 6.0(ベータ版)でPowerShellを使用し始めたところ、次のように動作します。
if ($members.NoteProperty) {
# NoteProperty exist
}
または
if (-not $members.NoteProperty) {
# NoteProperty does not exist
}