首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哈希表中带有PowerShell ScriptBlock的自定义ScriptBlock cmdlet

哈希表中带有PowerShell ScriptBlock的自定义ScriptBlock cmdlet
EN

Stack Overflow用户
提问于 2019-03-04 14:43:18
回答 1查看 379关注 0票数 0

我在C#中有一个定制的Powershell Cmdlet,一切都很好。

其中一个参数是HashTable。如何在该参数中使用ScriptBlock?当我将参数设置为@{file={$_.Identity}}时,我希望在ProcessRecord方法中获得一个具有Identity属性的管道对象。我怎么能这么做?

现在,我简单地将哈希表的键/值转换为Dictionary<string, string>,但我希望获得一个管道对象属性(string)。

现在,我得到了一个ScriptBlock无法转换为字符串的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-05 10:33:16

为此,您可以使用ForEach-Object

代码语言:javascript
复制
function Invoke-WithUnderScore {
  param(
    [Parameter(ValueFromPipeline)]
    [object[]]$InputObject,
    [scriptblock]$Property
  )

  process {
    $InputObject |ForEach-Object $Property
  }
}

然后使用例如:

代码语言:javascript
复制
PS C:\> "Hello","World!","This is a longer string" |Invoke-WithUnderscore -Property {$_.Length}
5
6
23

或者在C# cmdlet中:

代码语言:javascript
复制
[Cmdlet(VerbsCommon.Select, "Stuff")]
public class SelectStuffCommand : PSCmdlet
{
    [Parameter(Mandatory = true, ValueFromPipeline = true)]
    public object[] InputObject;

    [Parameter()]
    public Hashtable Property;

    private List<string> _files;

    protected override void ProcessRecord()
    {
        string fileValue = string.Empty;
        foreach (var obj in InputObject)
        {
            if (!Property.ContainsKey("file"))
                continue;

            if (Property["file"] is ScriptBlock)
            {
                using (PowerShell ps = PowerShell.Create(InitialSessionState.CreateDefault2()))
                {
                    var result = ps.AddCommand("ForEach-Object").AddParameter("process", Property["file"]).Invoke(new[] { obj });
                    if (result.Count > 0)
                    {
                        fileValue = result[0].ToString();
                    }
                }
            }
            else
            {
                fileValue = Property["file"].ToString();
            }

            _files.Add(fileValue);
        }
    }

    protected override void EndProcessing()
    {
        // process _files
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54985556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档