PowerShell技术疑问:Write-Information无法写入Transcript的原因及$DBVersion.Value引用问题
问题解答
1. 为什么Write-Information无法输出$DBVersion.Value?
这是因为Write-Information和Write-Host的参数处理逻辑完全不同:
Write-Host的核心参数是-Object,它接受一个对象数组,会把所有传入的位置参数都转换成字符串后拼接输出。所以你写Write-Host "Debug:"$DBVersion.value时,"Debug:"和$DBVersion.value是两个独立的位置参数,都会被处理并拼接。- 而
Write-Information的第一个位置参数是-MessageData(只接受单个对象),第二个位置参数是-InformationAction(只能是SilentlyContinue/Continue等枚举值)。当你写Write-Information "Debug:"$DBVersion.value时,PowerShell会把"Debug:"传给-MessageData,把$DBVersion.value(字符串类型的版本号)传给-InformationAction——但版本号不是合法的InformationAction值,所以这个参数会被忽略,最终只输出"Debug:"。
解决办法:把变量嵌入到字符串里(用子表达式确保属性被正确解析),或者将整段内容作为单个参数传递:
# 方式1:用子表达式在字符串内解析属性 Write-Information "Debug: $($DBVersion.value)" # 方式2:用字符串拼接合并为单个参数 Write-Information ("Debug:" + $DBVersion.value)
2. 为什么Write-Host的引号外部必须用$DBVersion.Value才能正确输出?
这是因为$DBVersion是Invoke-Sqlcmd返回的DataRow对象,当你在双引号字符串里直接写$DBVersion.value时,PowerShell的变量解析逻辑会把$DBVersion当作完整变量名,后面的.value会被视为普通字符串。也就是说:
# 这样写会输出 "Debug: System.Data.DataRow.value" Write-Host "Debug:$DBVersion.value"
因为PowerShell会先把$DBVersion(DataRow对象)转换成字符串(默认输出类型名System.Data.DataRow),再拼接.value字符串,而不是去读取对象的value属性。
正确的写法有两种:
- 把变量放在引号外面,让PowerShell分别处理字符串和对象属性:
Write-Host "Debug:" $DBVersion.value - 在引号内用子表达式
$()强制解析对象属性:Write-Host "Debug: $($DBVersion.value)"
额外小提示
另外,建议在使用Write-Information时,确保你的信息流级别是开启的(默认是开启的,但如果有修改过可以用$InformationPreference = 'Continue'确认),不过你的问题里不是这个原因,因为日志里已经输出了INFO: Debug:,说明信息流是正常工作的。
内容的提问来源于stack exchange,提问作者Adam Lacey
相关产品推荐
相关产品推荐

