我试图在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
答案 0 :(得分:1)
不过,我想知道我的原始语法有什么问题。
您的原始语法(从根本上说是正确的)使用argument mode,其中松散地说,参数评估如下:
$
,(
或@
开头的参数被视为字符串,即使未引用;值得注意的是,[
在这些特殊字符中不是。因此, [System.Text.Encoding]::UTF8
被解释为字符串文字 ,而不是作为返回System.Text.Encoding
实例的表达式,而不是{{1可以找到第三个参数是 string 的构造函数。
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
)中。