[英]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.