这个迭代列表的 powershell 脚本有什么问题?foreach-object -process { set-ali



我有一个返回Linux别名列表的模块(我做的类(

当我尝试在会话中将它们迭代为 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并写入主机 $_。每次迭代的值。 它首先写入名称,然后写入值,如下所示:

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

我猜 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重载;即,让它将存储在List实例中的LinuxAlias实例个发送到管道。

最新更新