簡體   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