.net 如何在Powershell中使用编码创建System.IO.StreamWriter?

.net 如何在Powershell中使用编码创建System.IO.StreamWriter?,.net,powershell,syntax,constructor,.net,Powershell,Syntax,Constructor,我正在尝试在PowerShell中创建UTF8编码的StreamWriter实例 $f = New-Object System.IO.StreamWriter "a.txt", $false, [System.Text.Encoding]::UTF8 这会引发错误: 新对象:找不到StreamWriter的重载,参数计数为:3 我正在尝试调用此构造函数: 不过,我还是想知道我原来的语法有什么问题 您的原始语法基本上正确地使用了,其中的参数粗略地说,计算如下: $f = New-Object

我正在尝试在PowerShell中创建UTF8编码的StreamWriter实例

$f = New-Object System.IO.StreamWriter "a.txt", $false, [System.Text.Encoding]::UTF8
这会引发错误: 新对象:找不到StreamWriter的重载,参数计数为:3

我正在尝试调用此构造函数:

不过,我还是想知道我原来的语法有什么问题

您的原始语法基本上正确地使用了,其中的参数粗略地说,计算如下:

$f = New-Object IO.StreamWriter -ArgumentList ("a.txt", $false, [Text.Encoding]::UTF8)
不以$或@开头的参数被视为字符串,即使不带引号;值得注意的是,[不在这些特殊角色之列。 因此,[System.Text.Encoding]::UTF8被解释为字符串文字,而不是返回System.Text.Encoding实例的表达式,并且找不到第三个参数为字符串的System.IO.StreamWriter构造函数

不幸的是,错误消息只提到参数的计数,而没有指出错误的类型可能是原因;这是一个已知的问题-请参阅。 正确的解决方案,如在的注释中所述,是将[System.Text.Encoding]::UTF8括在…中,以便强制其在表达式模式下求值,从而产生所需的结果

请注意,上述内容还意味着a.txt周围的…双引号不是必需的,但不会造成任何伤害,因此我们得到:

注意:为简洁起见,我在以下示例命令中省略了完整类型中的初始System.components;例如,IO.StreamWriter指System.IO.StreamWriter。在大多数上下文中,指定System.part在PowerShell中是可选的

请注意,是单个构造函数参数之间的,导致它们作为数组(即,单个参数)传递到,并在位置上绑定到数组类型的-ArgumentList-Args参数。 顺便说一下:将单个参数按位置传递给单独的参数更为常见,并且需要空格来分隔它们;例如,Select字符串foo t.txt被解析为 选择String-Pattern foo-Path t.txt

您自己的答案“因为已删除”使用了伪方法语法,这是最好避免的,并且仅适用于以下情况:

尽管这看起来像是一个方法调用构造函数调用,但事实并非如此,它的实际解析如下:

$f = New-Object IO.StreamWriter -ArgumentList ("a.txt", $false, [Text.Encoding]::UTF8)
也就是说,您已将原始参数数组括在…,这将导致在表达式模式下解析其元素,包括[Text.Encoding]::UTF8,这恰好解决了您的问题

请注意,与参数模式不同,在表达式模式中,字符串a.txt必须包含在…或“…”中

请注意,PSv5+通过类型信息对象上公开的静态新方法提供了一种基于方法的方法来构造对象,在这种情况下,所有参数都以表达式模式解析:

关于何时需要[System.Text.Encoding]:UTF8的说明:

与Windows PowerShell不同,.NET默认使用UTF-8,PowerShell[Core]v6+现在也使用UTF-8

因此,在读取数据时,通常不需要显式请求UTF-8编码

当您写入数据时,传递[System.Text.Encoding]:UTF8将生成一个带有的UTF-8文件,而依赖默认UTF-8编码将创建一个没有BOM的文件,这有利于跨平台的互操作;要明确请求无BOM编码,请使用[System.Text.Utf8Encoding]::新建


您确定安装了正确的.Net吗?显然,该构造函数是在.Net 3.0中引入的。@DanRayson-是的。我有最新的.Net,它来自C应用程序,工作得很好。@DanRayson-$false在我选中时是布尔类型。@DanRayson$false是一个只读的,包含布尔值false。如果您在powershell 5上,请使用构造函数语法:$f=[IO.StreamWriter]::new'a.txt',$false[Text.Encoding]::UTF8
$f = New-Object IO.StreamWriter -ArgumentList ("a.txt", $false, [Text.Encoding]::UTF8)
# PowerShell version 5 and above; you can use the ::new() method on types.
$f = [IO.StreamWriter]::new("a.txt", $false, [Text.Encoding]::UTF8)