如何在Powershell中使用Encoding创建System.IO.StreamWriter?

时间:2018-05-31 15:33:03

标签: c# powershell

我试图在PowerShell中使用UTF8编码创建StreamWriter实例。

$f = New-Object System.IO.StreamWriter "a.txt", $false, [System.Text.Encoding]::UTF8

这会引发错误: New-Object:无法找到" StreamWriter"和参数计数:" 3"。

我试图调用此构造函数: https://msdn.microsoft.com/en-us/library/f5f5x7kt(v=vs.110).aspx

1 个答案:

答案 0 :(得分:1)

  

不过,我想知道我的原始语法有什么问题。

您的原始语法(从根本上说是正确的)使用argument mode,其中松散地说,参数评估如下:

  • 不以$(@开头的参数被视为字符串,即使未引用;值得注意的是,[在这些特殊字符中不是

因此, [System.Text.Encoding]::UTF8被解释为字符串文字 ,而不是作为返回System.Text.Encoding实例的表达式,而不是{{1可以找到第三个参数是 string 的构造函数。

  • 不幸的是,错误消息只提到参数的 count ,而没有指出错误的类型可能是原因;这是一个已知问题 - 请参阅this GitHub issue

PetSerAl评论中提到的正确解决方案是System.IO.StreamWriter括在[System.Text.Encoding]::UTF8中,以便在表达式中强制进行评估模式,它会产生所需的结果。

请注意,上述内容也意味着(...)周围的"..."不是必需的(但不会造成伤害),所以我们得到:

a.txt

请注意,参数数组隐式绑定到$f = New-Object System.IO.StreamWriter a.txt, $false, ([System.Text.Encoding]::UTF8) 的{​​{1}}参数。

Your own answer 使用最好避免的 - 方法 且只使用发生工作:

New-Object

即使这看起来像一个方法调用(构造函数调用),但它不是,实际上解析如下:

-ArgumentList

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

请注意 - 与参数模式不同 - 字符串(...) 必须在表达式模式中包含在[System.Text.Encoding]::UTF8(或a.txt)中。