PowerShell通过Write-Host和Write-Output向控制台输出不同的输出

时间:2013-11-26 05:40:28

标签: powershell io

以下是一个小型PowerShell脚本。

function test() {
    $paramstring = "name=vindhya 
    id=182122"
    $hash_params = convertfrom-stringdata -stringdata $paramstring
    Write-Host $hash_params
    callee $hash_params
}


function callee() {
    param($hash_params)
    #$hash_params
}

test

输出 System.Collections.Hashtable

但如果Write-HostWrite-Output取代,那么

function test() {
    $paramstring="name=vindhya 
    id=182122"
    $hash_params = convertfrom-stringdata -stringdata $paramstring
    Write-Output $hash_params
    callee $hash_params
}


function callee() {
    param($hash_params)
    #$hash_params
}

test

输出

Name                           Value

----                           -----

name                           vindhya

id                             182122

为什么写主机和写输出的表现不同?

3 个答案:

答案 0 :(得分:3)

Write-Output会将输出传递给管道的下一步。如果您在管道的末尾,那么它将输出到控制台。

Write-Host将输出到控制台。如果输出目标是一个对象,它将调用toString()方法将对象转换为字符串然后输出它。通常,字符串是对象的类型名称。

您可以在代码中添加另一个cmdlet Out-String,然后Write-Host会输出与Write-Output类似的内容:

Write-Host ($hash_params | Out-String)

我的测试如下:

function test() {
    $paramstring = "name=vindhya
    id=18250"
    $hash_params = convertfrom-stringdata -stringdata $paramstring
    Write-Output $hash_params.toString()
    Write-Host ($hash_params | Out-String)
    callee $hash_params
}


function callee() {
    param($hash_params)
    #$hash_params
}

test

输出结果为:

System.Collections.Hashtable

Name        Value
----        ----
id          18250
name        vindhya

答案 1 :(得分:2)

Write-Object通过PowerShell的格式化引擎发送对象。这涉及检查是否存在格式数据文件,其中包含对象类型的格式化说明。格式化文件可以选择各种不同的默认显示格式:表,列表,宽等。如果对象没有格式化数据,PowerShell将使用其他条件(如公共属性的数量)来确定是使用表视图还是列表视图。作为最后的手段,它会尝试使用对象的ToString()方法强制转换为字符串。

Write-Host没有这个(除了关于强制转换为字符串的最后一部分)。它只显示您提供的字符串。如果你提供的东西不是字符串,它会尝试简单强制字符串,就是这样。通常这只会导致对象的类型名称。

答案 2 :(得分:1)

我用PowerShell面对这个问题。我相信使用Write-Host通常不能很好地完成编写对象 - 它看起来更适合字符串。如果要编写对象,则需要使用Write-Output。

From the Powershell documentation,Write-Output用于“将对象管道传递到管道中的下一个命令”。由于没有“下一个命令”,Write-Output正在控制台上打印对象。

此外,简单地写$objName似乎在幕后调用写输出。因此,如果您希望返回哈希表,那么

function Foo {
    # Generate $hash_params
    $hash_params
    return
}

这会将$hash_params传递给调用Foo的任何内容。