繁体   English   中英

这个迭代 List 的 powershell 脚本有什么问题? Foreach-Object -Process { 设置别名 ... }

[英]What is wrong with this powershell script that iterates a List? Foreach-Object -Process { Set-Alias ... }

我有一个返回 LinuxAlias 列表的模块(我创建的类)

当我尝试在会话中将它们迭代到 Set-Alias 时,我遇到了麻烦。

数据:MyModule 有 Get-LinuxAliases 命令。 Get-LinuxAliases 命令是一个二进制模块,它返回一个 LinuxAlias 列表。

输出定义:

[OutputType(typeof(List<LinuxAlias>))]

Linux别名定义:

public class LinuxAlias
    {
        public String Name { get; set; }
        public String RawCommand { get; set; }

        public String Value { get; set; }
        public String TranslatedPowershellCommand { get; set; }
        public class COMMENT_BLOCK_EXCEPTION : Exception
        {
        }
        public class EMPTY_LINE_EXCEPTION : Exception
        {
        }
        public class UNRECOGNIZED_INPUT : Exception
        {
        }
    }

我愿意:

if ( Get-Module "MyModule" ) {
    Get-LinuxAliases | ForEach-Object -Process { 
        try {
            [string]$name = $_.Name;
            [string]$val = $_.Value;
                Set-Alias -Name $name -Value $val -Force;
        }
        catch {
            Write-Warning $_.Exception.GetType().FullName;
        }

    }
}

什么是预期的行为? 自从我注意到,例如。 如果我每次迭代只Write-Host $_.Name和写主机 $_.Value。 它首先将写入名称,然后写入值,例如:

name1 name2 ... value1 value2 ...

我猜在 For-Each 迭代器中什么不是预期的行为。 它应该是:

名称1 值1 名称2 值2

(Get-LinuxAliases) [0] 返回:

Name RawCommand Value TranslatedPowershellCommand
---- ---------- ----- ---------------------------
cls  'clear'    clear

有人可以让我了解这种情况吗?

提前致谢。

返回一个 LinuxAlias 列表。

通常,除特殊情况外, cmdlet

  • 不应输出集合类型的实例(例如您的情况下的List )。
  • 相反,应该将多个对象一一输出到管道

原因是其他 cmdlet(例如ForEach-Object )期望其他命令按对象生成输出对象

Get-LinuxAliases | ForEach-Object -Process { ...

对于您当前的设计, ForEach-Object接收一个作为整体列表单个输入对象,这不是您的意图。

所以:

  • 让你的 cmdlet 实现类表明它返回LinuxAlias ,而不是它的列表 PowerShell总是暗示可能会返回该类型的多个实例。

     [OutputType(typeof(LinuxAlias)]
  • 要从 cmdlet 生成输出,请使用WriteObject(list, true) ,即使用枚举集合WriteObject重载 也就是说,令其发送LinuxAlias存储在您的实例List的一个实例的管道之一

处理列表中的项目<object>通过一组线程 - 线程池<div id="text_translate"><pre>public void multithread() { List&lt;Bbject&gt; objectlist= new List&lt;Object&gt;{ //consider it has around 10 objects }; foreach (var obj in objectlist) { Process(obj); } } private void process(Object obj) { //Implementation }</pre><p> 我正在尝试实现多线程,其中每个线程采用 object 并对其进行处理...我尝试创建 5 个单独的线程,其中每个线程处理 2 个对象...但它更像是硬配置...有什么方法可以使用它来实现它线程池...</p></div></object>

[英]Process items in list<Object> by a set of threads - threadpooling

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM