源代码中字符串文字的字符编码问题(utf8 无 bom)

sus*_*art 1 powershell utf-8 character-encoding codepages invoke-command

$logstring = Invoke-Command -ComputerName $filesServer   -ScriptBlock {\n        param(\n            $logstring,\n            $grp\n        )\n\n    $Klassenbuchordner = "KB " + $grp.Gruppe\n    $Gruppenordner = $grp.Gruppe\n    $share = $grp.Gruppe\n    $path = "D:\\Gruppen\\$Gruppenordner"\n\n    if ((Test-Path D:\\Dozenten\\01_Klassenb\xc3\xbccher\\$Klassenbuchordner) -eq $true)\n    {$logstring += "Verzeichnis f\xc3\xbcr Klassenb\xc3\xbccher existiert bereits"}\n    else {\n        mkdir D:\\Dozenten\\01_Klassenb\xc3\xbccher\\$Klassenbuchordner\n        $logstring += "Klassenbuchordner wurde erstellt!"\n    }} -ArgumentList $logstring, $grp\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的目标是测试目录是否存在并根据需要创建它。

\n\n

问题是路径包含德文字母(元音变音),目标服务器无法正确识别这些字母。

\n\n

例如,服务器收到路径"D:\\Dozent\\01_Klassenb\xc3\x83\xc2\xbccher"而不是预期的"D:\\Dozent\\01_Klassenb\xc3\xbccher".

\n\n

如何强制使用正确的 UTF-8 编码?

\n

mkl*_*nt0 5

注意:远程处理和使用Invoke-Command是您的问题所附带的

\n

由于问题是由源代码( )中的字符串文字引起的,最可能的解释是PowerShell 错误解释了您的脚本文件...\\01_Klassenb\xc3\xbccher\\...

\n

Windows PowerShell中,如果您的脚本文件实际上是 UTF-8 编码但缺少 BOM,则 PowerShell 引擎将错误解释脚本中的任何非 ASCII 范围字符(例如)。[1]\xc3\xbc

\n

因此:将脚本重新保存为带有 BOM 的UTF-8 。

\n

笔记:

\n
    \n
  • 在按需安装的跨平台PowerShell (Core) 7+版本(始终默认为(无 BOM)UTF-8)中,UTF-8 BOM 不再是严格必需的,但如果您希望您的脚本可以在两个PowerShell 版本中运行。
  • \n
\n
\n

为什么应该将脚本保存为带有 BOM 的 UTF-8:

\n

默认情况下,Visual Studio Code和其他现代编辑器创建没有 BOM 的UTF-8 文件,这就是导致 Windows PowerShell 中出现问题的原因。

\n

相比之下,PowerShell ISE 创建“ANSI”编码的[1]文件,Windows PowerShell(但不是 PowerShell Core)可以正确读取这些文件。

\n

您只能使用“ANSI”编码的文件:

\n
    \n
  • 如果您的脚本永远不会在 PowerShell Core中运行- 所有未来的开发工作都将在其中运行。

    \n
  • \n
  • 如果您的脚本永远不会在有效的不同“ANSI”代码页的计算机上运行。

    \n
  • \n
  • 如果您的脚本不包含无法用“ANSI”代码页表示的字符(例如表情符号)。

    \n
  • \n
\n

鉴于这些限制,始终将 PowerShell 脚本创建为带有 BOM 的 UTF-8是最安全且面向未来的
\n(或者,您可以使用 UTF-16(始终使用BOM保存),但如果您主要使用 ASCII/“ANSI”范围字符(这可能在 PS 脚本中),则会导致文件大小增大) 。

\n
\n

如何让 Visual Studio Code默认为 PowerShell 脚本创建带有 -BOM 的UTF-8 文件:

\n

注意:自VSCode的 PowerShell 扩展 v1.11.0 起,仍需要执行以下操作,但GitHub 上并不建议将扩展默认PowerShell 文件设置为带有 BOM 的 UTF-8

\n

将以下内容添加到您的settings.json文件中(从命令选项板(Ctrl+Shift+P,键入settings并选择Preferences: Open Settings (JSON)):

\n
"[powershell]": {\n  "files.encoding": "utf8bom"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,该设置有意仅限于PowerShell文件,因为您不希望所有文件都默认为带 BOM 的UTF-8 ,因为 Unix 平台上的许多实用程序既不期望也不知道如何处理此类 BOM。

\n
\n

[1] 在没有 BOM 的情况下,Windows PowerShell 默认使用系统当前“ANSI”代码页的编码,该编码由旧系统区域设置确定;例如,在西欧文化中,Windows-1252。

\n