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

2024-02-25

我正在尝试在 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 https://msdn.microsoft.com/en-us/library/f5f5x7kt(v=vs.110).aspx


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

你原来的语法(基本上正确)使用argument mode https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_parsing,其中参数,粗略地说,评估如下:

  • 不以任何一个开头的争论$, (, or @被视为string,即使没有引用;尤其,[ is not这些特殊字符之中。

所以,[System.Text.Encoding]::UTF8被解释为字符串字面量而不是作为返回一个的表达式System.Text.Encoding实例,并且没有System.IO.StreamWriter第三个参数是 a 的构造函数string可以被找寻到。

  • 不幸的是,错误消息只提到了count的参数,而不表明不正确type可能是原因;这是一个已知问题 - 请参阅GitHub 问题 #3658 https://github.com/PowerShell/PowerShell/issues/3658.

正确的解决方案,正如评论中提到的PetSerAl https://stackoverflow.com/users/4003407/petseral, is to enclose [System.Text.Encoding]::UTF8 in (...)从而迫使其评估表达 mode,它会产生所需的结果。

请注意,上述内容还意味着"..."(双引号)周围a.txt不是必要的(但不会造成伤害),所以我们得到:

Note: For brevity, I've omitted the initial System. components from the full types in the following sample commands; e.g., IO.StreamWriter refers to System.IO.StreamWriter. Specifying the System. part is optional in PowerShell in most contexts.

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

注意它是,在各个构造函数参数之间,导致它们作为array- 即,一个单一参数 - to New-Object https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/new-object,它(在位置上)绑定到数组类型-ArgumentList (-Args) 范围。
顺便说一句:将各个参数按位置传递给separate参数比较常见,需要spaces将他们分开;例如。,Select-String foo t.txt被解析为
Select-String -Pattern foo -Path t.txt.


您自己的答案(已删除)使用pseudo方法语法那是最好避免并且只有happens上班:

# AVOID: pseudo method syntax.
$f = New-Object IO.StreamWriter("a.txt", $false, [Text.Encoding]::UTF8)

尽管这looks就像方法调用(构造函数调用)一样,它不是,实际上解析如下:

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

那是,您已将原始参数数组括在(...),这会导致其元素被解析为表达 mode, 包括[Text.Encoding]::UTF8,这正好解决了你的问题。

请注意 - 与参数模式不同 - 字符串a.txt does必须包含在"..." (or '...') 在表达模式下。

作为旁白:

  • Set-StrictMode https://learn.microsoft.com/powershell/module/microsoft.powershell.core/set-strictmode -Version 2或更高,除其他外,prevents使用伪方法语法,但是only(一)对于两个或更多参数和 (b) 仅当参数列表 ((...))遵循命令名称(而不是argument,如在New-Object情况),并且(c)仅当有no space命令名和开头之间(; e.g.:
    & { Set-Strictmode -version 2; foo('a', 'b') }

注意PSv5+ does提供一个method基于方法来构造对象,通过static new() method裸露关于类型信息对象, 在这种情况下所有参数均在中解析表达 mode:

# PowerShell version 5 and above; you can use the ::new() method on types.
$f = [IO.StreamWriter]::new("a.txt", $false, [Text.Encoding]::UTF8)

注释when [System.Text.Encoding]::UTF8需要:

与 Window PowerShell 不同,.NET默认为UTF-8(PowerShell [Core] (v6+) 现在也支持)。

  • 当你read数据,因此通常不需要请求 UTF-8 编码明确地.

  • 当你write data, passing [System.Text.Encoding]::UTF8结果生成 UTF-8 文件with a BOM https://en.wikipedia.org/wiki/Byte_order_mark,同时依赖于defaultUTF-8编码创建文件withoutBOM(更有利于跨平台互操作性);要显式请求无 BOM 编码,请使用[System.Text.Utf8Encoding]::new().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Powershell中使用编码创建System.IO.StreamWriter? 的相关文章

  • Javascript:使用 IIFE 和块语句之间的区别

    IIFE主要用于封装作用域 function let myVar 10 not global 但为什么不直接使用块语句呢 let myVar 10 also not global 除了范围封装之外 进一步使用 IIFE 是否还有其他好处 块
  • VLC 媒体播放器有 C# 界面吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否可以使用 C 控制台应用程序中的包装器从 VLC 播放中当前播放的文件中读取曲目统计信息 时间 标
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • Powershell:当文件名包含字符 [ ] 时,移动项目不起作用

    关于使用 PowerShell 移动项目的简单问题 有谁知道为什么当文件名包含 或 字符时以下脚本不起作用 前任 文件1 VT txt ls j foreach itemName Name Replace destination ls wh
  • C#.NET 中的 App.config 是什么?如何使用它?

    我在 C NET 中完成了一个项目 其中我的数据库文件是 Excel 工作簿 由于连接字符串的位置在我的编码中是硬编码的 因此在我的系统中安装它没有问题 但对于其他系统则有问题 有没有办法在应用程序设置完成后提示用户设置一次路径 我得到的答
  • 使用 C++/CLI 包装非托管 C++ 类库 - 问题 2 - 集合

    Note 这篇文章代表了我的询问的问题 2 两个问题中都会重复介绍部分 达到数字之前的所有文本 因为它是回答问题可能需要的背景信息 问题简介 我有一个非托管 C 库 其中包含多个 更高级别 库所共有和共享的类和函数 我现在需要向 C Net
  • 在 .NET List 中设置项目 null 是否可以使其可用于垃圾回收,这是一个好主意吗?

    假设我有一个大列表 其中每个项目都被处理一次 然后在长时间操作期间不再查看 List
  • Outlook 2007 捕获 ReplyToAll 事件的共享加载项

    我正在使用 VS 2010 和 Dot Net Framework 2 0 我已在 扩展性 gt Outlook 共享加载项 中创建了一个项目 我正在尝试捕获 ReplyToAll 事件 但它没有被解雇 请看下面的代码 连接方法 inspe
  • 字符串索引和替换

    我今天刚刚遇到这个问题 想知道是否有人知道为什么这个测试可能会失败 取决于文化 目的是检查测试文本是否包含两个相邻的空格 这是根据string IndexOf 即使我告诉字符串替换所有出现的两个相邻空格 经过一些测试似乎 xAD以某种方式导
  • 如何在 PowerShell 中处理命令行参数

    处理命令行参数的 最佳 方法是什么 似乎有几个关于 最佳 方法是什么的答案 因此我陷入了如何处理像这样简单的事情上 script ps1 n name d domain AND script ps1 d domain n name 有没有一
  • 使用 C# 执行 Powershell commandlet 时出错

    我有以下经过测试且有效的代码 using new Impersonator Administrator dev dev RunspaceConfiguration runspaceConfiguration RunspaceConfigur
  • 为什么我会收到未找到分析器的警告?

    我创建了一个玩具项目来检查最新的 NET 7 预览版 5 和正则表达式代码生成 它效果很好 所以我对现有项目应用了相同的更改 不是为了生产 而是为了个人生产力 由于某种原因 我收到这些警告 CS8032 An instance of ana
  • 哪个更快:清除集合或实例化新集合

    我的代码中有一些通用列表 其中有数十或数百个元素 有时我需要用其他对象重新填充此列表 所以问题是 调用什么会更快Clear 方法或创建一个new List
  • javascript 函数后面括号中的值

    我正在尝试重新利用我在 SO 的答案中找到的一些 Javascript 代码 但我想首先更好地理解它的语法 其大纲是 function root ns factory some code window detectZoom function
  • .NET WebClient:DownloadString 在哪里?

    我可能在这里遗漏了一些东西 但是当我使用 WebClient 并查找 DownloadString 方法 如书籍示例中所示 时 我只看到 DownloadStringAsync 我缺少什么导入 您使用的是 Silverlight 吗 Sil
  • Gremlin.net 文本包含等效项

    我正在使用 Gremlin net 库连接到 janus 图形服务器 我使用 cassandra 和弹性搜索进行数据存储和索引 在我使用的 gremlin 语言和 gremlin 控制台中文本包含在属性的文本中进行搜索 我正在使用混合索引
  • 当我的进程被终止时到底会发生什么?

    我有一个包含本机代码和托管代码的混合进程 在 Windows Server 2003 上运行 当我从进程资源管理器中终止进程时 它会进入 100 cpu 的状态 并在消失之前保持这种状态一段时间 有时甚至 10 分钟 在此期间我无法 杀死
  • PowerShell-V5 Invoke-Webrequest 添加 2 个标头授权标头和接受接受标头

    我正在尝试创建一个脚本 该脚本将使用 powershell 和 invoke webrequest 自动升级 NSX 以利用 NSX Manager 的 API 调用 我已经完成了脚本 但脚本的某些部分我需要检查并匹配响应中的某些数据 事实
  • 实体框架:ObjectSet 及其(泛型)方差

    我使用 EntityFramework POCO 事情是这样的 public interface IBaseType int Id get set public class BaseType IBaseType public virtual

随机推荐