以下是一个小型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-Host被Write-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
为什么写主机和写输出的表现不同?
答案 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
的任何内容。