如何向New-Object传递类类型参数而非字符串?StreamWriter传参异常
解决PowerShell中StreamWriter构造函数参数类型错误的问题
我来帮你搞定这个头疼的问题!你遇到的情况是PowerShell在传递$outputStream给StreamWriter构造函数时,错误地将它转换成了字符串,导致调用了接受文件路径的构造函数,而非预期的接受Stream的版本。
问题根源
PowerShell的New-Object命令在处理参数时,偶尔会因为类型推断的模糊性,自动调用对象的ToString()方法将其转换成字符串——而NetworkStream的ToString()返回的是类型名称,这恰好匹配了StreamWriter(string path)这个构造函数,自然就触发了错误。
解决方案
这里有两个可靠的解决方法,任选其一就能解决问题:
方法1:使用静态构造函数调用(推荐,PowerShell 5+支持)
直接调用StreamWriter的静态构造函数,明确指定参数类型,完全避免类型推断的歧义:
$tcpClient = New-Object System.Net.Sockets.TCPClient $connect = $tcpClient.BeginConnect("localhost", 8080, $null, $null) $success = $connect.AsyncWaitHandle.WaitOne($testTimeoutMs, $true) # 确保连接成功后再获取流 if ($success -and $tcpClient.Connected) { [System.Net.Sockets.NetworkStream]$outputStream = $tcpClient.GetStream() # 用静态构造函数创建StreamWriter $writer = [System.IO.StreamWriter]::new($outputStream) }
方法2:给-ArgumentList参数加括号
如果坚持使用New-Object,给参数加上括号,强制PowerShell把$outputStream当作单个对象传递,而非拆分或转换:
$writer = New-Object System.IO.StreamWriter -ArgumentList ($outputStream)
额外注意事项
- 一定要在获取流之前确认TCP连接成功,否则
$outputStream可能为$null,同样会引发错误; - 如果需要指定编码,也可以在构造函数中添加第二个参数,比如
[System.IO.StreamWriter]::new($outputStream, [System.Text.Encoding]::UTF8)。
内容的提问来源于stack exchange,提问作者Hooch
相关产品推荐
相关产品推荐

