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