我有一个模块返回LinuxAlias列表(我制作的类)

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

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

输出定义:

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

LinuxAlias定义:
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和Write-Host $ _。Value。
它首先将写入名称,然后写入值,其内容类似于:

名称1
名称2
...
值1
值2
...

我猜对于For-Each迭代器,预期的行为是什么?
它应该是:

名称1值1名称2值2

(Get-LinuxAliases)[0]返回:
Name RawCommand Value TranslatedPowershellCommand
---- ---------- ----- ---------------------------
cls  'clear'    clear

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

提前致谢。

最佳答案



通常,除特殊情况外, cmdlet :

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

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



    在您当前的设计中,ForEach-Object接收单个输入对象,该对象是整个列表,而不是您的意图。

    因此:
  • 使您的cmdlet实现类指示其返回LinuxAlias ,而不是其列表;在PowerShell中总是暗示可能会返回该类型的多个实例。
    [OutputType(typeof(LinuxAlias)]
    
  • 要从您的cmdlet生成输出,使用WriteObject(list, true),即,使用 WriteObject overload that enumerates collections ;也就是说,使其将存储在LinuxAlias实例中的List实例一一发送到管道。
  • 关于c# - 此Powershell脚本迭代列表有什么问题? Foreach对象过程{Set-Alias…},我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59500668/

    10-09 18:45