powershell-在函数内部显示数组

时间:2020-06-29 21:08:57

标签: powershell

所以我有一个对象

$appstatus=[pscustomobject] @{
 txtlist=@()
 csvlist=@()
 someotherproperties
}

和一个加载TXT或导入CSV文件的函数。根据所选的文件名,它会填充$ appstatus对象的一个​​属性。然后,我还有另一个功能来显示当前加载的列表。像

function showhosts(){
        if(($appstatus.txtlist).count -gt 0){
            write-host $appstatus.txtlist
        }else{
            write-host $appstatus.csvlist
        }
}

txtlist很好,但是问题是csvlist的问题,因为write-host不会显示漂亮的表格式,但是这个@ {property = value; ...}长字符串代替。我不能只在没有写主机的情况下键入$ appstatus.csvlist,因为它不会显示,而是变成函数的返回值,所以我该如何在函数内很好地显示对象,就像从调用它一样主脚本?

1 个答案:

答案 0 :(得分:2)

要求如下:

  1. 在控制台上显示数据而无需写入成功流。
  2. 显示默认的PowerShell格式输出

您可以为此使用Out-Host

function showhosts(){
        if(($appstatus.txtlist).count -gt 0){
            $appstatus.txtlist | Out-Host
        }else{
            $appstatus.csvlist | Out-Host
        }
}

Write-Host默认情况下不输出到成功流,并且在打印到控制台时具有更强大的功能。从PowerShell 5开始,它将写入信息流,该信息流可以存储在变量中,以后可以访问。如果您想通过典型的变量分配来捕获信息流,则信息流也可以重定向到成功流。但是,它确实将输出字符串化到控制台,该控制台解释了@{property = value}语法。然后,在大多数系统上,任何[string]强制转换数组都由一个空格连接,因为这是默认的分隔符。

# Example 1
# Stringify simple array
Write-Host 1,2,3
1 2 3

# Example 2
# Stringify an array of custom objects
Write-Host $obj.two
@{property=value1} @{property=value2}

# Example 3
# Saving Write-Host output to variable $out using information stream
Write-Host $obj.two -InformationVariable out
@{property=value1} @{property=value2}
$out
@{property=value1} @{property=value2}

# Redirecting information stream to success stream
# Notice write-host no longer outputs to console after redirection
# $out has normal output plus write-host output
$out = "first line`n"
$out += Write-Host $obj.two 6>&1
$out
first line
@{property=value1} @{property=value2}