0

複数の配列を持つオブジェクトで Null または空をチェックするにはどうすればよいですか?

$buildings.North = {bld1,bld2,bld3}
$buildings.South = {}
$buildings.East = {bld5,bld6}
$buildings.West = {bld7,bld8,bld9,bld10}

最初は if / elseif を使ってそれぞれを調べましたが、これは 16 通りの組み合わせになります。

if ($Buildings.North.count -eq "0" -and $Buildings.South.count -ge "1" -and $Buildings.East.count -ge "1" -and $Buildings.West.count -ge "1" ){set-function -OPT1 $Buildings.South -OPT2 $Buildings.East -OPT3 $Buildings.West }
elseif ($Buildings.North.count -ge "1" -and $Buildings.South.count -ge "1" -and $Buildings.East.count -ge "1" -and $Buildings.West.count -ge "1" ){set-function -OPT1 $Buildings.North -OPT2 $Buildings.South -OPT3 $Buildings.East -OPT4 $Buildings.West}
elseif ($Buildings.North.count -eq "0" -and $Buildings.South.count -eq "0" -and $Buildings.East.count -eq "0"  -and $Buildings.West.count -eq "0"){#empty do nothing}
elseif ($Buildings.North.count -eq "0" -and $Buildings.South.count -eq "0" -and $Buildings.East.count -ge "1" -and $Buildings.West.count -ge "1" ){set-function -OPT3 $Buildings.East -OPT4 $Buildings.West}

オブジェクトには何百ものオプションを含めることができるため、大量のコードになる可能性があります。また、文字列からコマンドを作成しようとしました:

$cmd = ' -Location $Loc' 
if ($Buildings.North.count -ge "1"){ $cmd += ' -OPT1 $Buildings.North ' }
elseif ($Buildings.South.count -ge "1"){$cmd += ' -OPT2 $Buildings.South'}
elseif ($Buildings.East.count -ge "1"){$cmd += ' -OPT3 $Buildings.East'}
elseif ($Buildings.West.count -ge "1"){$cmd += ' -OPT4 $Buildings.West'}
Set-Function $cmd 

このアプローチでもあまり成功しません。この種のチェックを行うためのより良い方法が必要です。それを見つけるのを手伝っていただければ幸いです。

4

3 に答える 3

2

これはうまくいくはずです:

$cmd = ' -Location `$Loc' 
if ($Buildings.North.count -ge "1"){ $cmd += ' -OPT1 `$Buildings.North ' }
elseif ($Buildings.South.count -ge "1"){$cmd += ' -OPT2 `$Buildings.South'}
elseif ($Buildings.East.count -ge "1"){$cmd += ' -OPT3 `$Buildings.East'}
elseif ($Buildings.West.count -ge "1"){$cmd += ' -OPT4 `$Buildings.West'}
Invoke-Expression "Set-Function $cmd"
于 2013-03-20T21:32:42.623 に答える
0
$Opts = @{
OPT1 = $buildings.North
OPT2 = $buildings.South
OPT3 = $buildings.East
OPT4 = $buildings.West
}

$opts.GetEnumerator() |
foreach {if (-not $_.value){$opts.Remove($_.Name)}}

Set-Function @Opts 

FWIW

于 2013-03-20T22:53:20.187 に答える
0
#Create Test Object
$buildings = New-Object -TypeName psobject -Property @{'North'=@('a','b');'south'=@('x');'West'=@()}

#Returns arrays that are not 0 in count
$buildings | Get-Member -MemberType NoteProperty | ? {($buildings.($_.name)).count}
于 2013-03-21T05:23:37.090 に答える