我有一个返回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
实例逐个发送到管道。