Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将方法设置为Powershell中对象的属性_Powershell - Fatal编程技术网

将方法设置为Powershell中对象的属性

将方法设置为Powershell中对象的属性,powershell,Powershell,我有一个像这样的对象数组 $all = @( @{ Name = 'First'; Method = { FirstMethod 1 }; Description = "First Description"; } @{ Name = 'Second'; Description = "Second Description" } @{ Name = 'Third'; Method = { ThirdMethod }; Description = "Third Descrip

我有一个像这样的对象数组

$all = @(
    @{ Name = 'First'; Method = { FirstMethod 1 }; Description = "First Description";  }
    @{ Name = 'Second'; Description = "Second Description" }
    @{ Name = 'Third'; Method = { ThirdMethod }; Description = "Third Description" }
)
每个对象都有一个名称(字符串)、一个描述(字符串)和一个方法(包含函数及其可选项)

FirstMethod
SecondMethod
如下所示:

Function FirstMethod
{
    param($number)
    Write-Host "$number - some other things"
    return $number
}

Function ThirdMethod
{
    Write-Host "Second called"
    return 'test'
}
$obj1 = [PSCustomObject]@{
    Name        = 'First'
    Description = 'First Description'
}
$obj1 | Add-Member -Name 'Method' -Type ScriptMethod -Value {FirstMethod 1}

$obj2 = [PSCustomObject]@{
    Name        = 'Second'
    Description = 'Second Description'
}

$obj3 = [PSCustomObject]@{
    Name        = 'Third'
    Description = 'Third Description'
}
$obj3 | Add-Member -Name 'Method' -Type ScriptMethod -Value {ThirdMethod}

$all = $obj1, $obj2, $obj3
我正在遍历
$all
中的所有项目,并尝试调用
方法
参数(如果存在):

Function RunAll
{
    foreach($item in $all)
    {
        If($item.Method)
        {
            Write-Host "It has method and its running it"
            $returned_from_method = $item.Method
            Write-Host "Value returned from method: $returned_from_method"
        }
        Else
        {
            Write-Host "Does not have a method!"
        }
    }
}
所以基本上我在这里需要的是:当循环在数组的
第一个
$returned\u from\u method=$item.method
中时,它应该返回
1
(因为它调用
FirstMethod
并通过1。当循环在数组的
第三个
项中时,它应该返回
test
(因为它调用了
ThirdMethod


我能做到这一点吗?

如果有人在为这一点而挣扎,下面是答案: 方法
FirstMethod
ThirdMethod
应该在数组之前声明 然后我需要在
()
中添加函数,而不是
{}

Function FirstMethod
{
    param($number)
    Write-Host "$number - some other things"
    return $number
}

Function ThirdMethod
{
    Write-Host "Second called"
    return 'test'
}

$all = @(
    @{ Name = 'First'; Method = ( FirstMethod 1 ); Description = "First Description";  }
    @{ Name = 'Second'; Description = "Second Description" }
    @{ Name = 'Third'; Method = ( ThirdMethod ); Description = "Third Description" }
)

现在它工作正常了!

您发布的代码既不定义(自定义)对象也不定义方法。它定义了一个哈希表列表,其中一个键具有scriptblock值。对该键使用点访问将只返回scriptblock的定义,而不调用它

演示:

PS C:\> $ht = @{Name='foo'; Method={FirstMethod 1}; Description='bar'} PS C:\> $ht.Method FirstMethod 1 scriptblock中调用的函数是在创建哈希表或对象之前还是之后定义并不重要,只要它是在调用scriptblock之前定义的。您自己的答案中的代码似乎只起作用,因为您用分组表达式(括号)替换了scriptblock(花括号)。但是,这意味着“方法”是根据哈希表的定义进行评估的,并且只有函数的返回值与键一起存储。
Write Host
输出立即写入控制台,而不是与键一起存储

PS C:\> $ht = @{Name='foo'; Method=(FirstMethod 1); Description='bar'} 1 - some other things PS C:\> $ht.Method 1
这不是您在PowerShell中定义对象或对象方法的方式。谢谢!是否可以调用
$obj1.Method.Invoke()
并将参数传递给它?@ErtanHasani如果您有一个带有实际对象方法的适当对象,它应该是
$obj1.Method()
,而不是
$obj1.Method.Invoke())
。是的,如果scriptblock被定义为接受参数,则可以传递参数。 PS C:\> $ht = @{Name='foo'; Method=(FirstMethod 1); Description='bar'} 1 - some other things PS C:\> $ht.Method 1 PS C:\> $obj | Add-Member -Name 'Method2' -Type ScriptMethod -Value {FirstMethod 2} PS C:\> $obj.Method2() 2 - some other things 2
$obj1 = [PSCustomObject]@{
    Name        = 'First'
    Description = 'First Description'
}
$obj1 | Add-Member -Name 'Method' -Type ScriptMethod -Value {FirstMethod 1}

$obj2 = [PSCustomObject]@{
    Name        = 'Second'
    Description = 'Second Description'
}

$obj3 = [PSCustomObject]@{
    Name        = 'Third'
    Description = 'Third Description'
}
$obj3 | Add-Member -Name 'Method' -Type ScriptMethod -Value {ThirdMethod}

$all = $obj1, $obj2, $obj3