[英]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
的一个实例的管道之一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.