Powershell:如何对包含 Unicode 字符的路径执行命令?

Powershell: how to execute command for a path containing Unicode characters?

我试图在 Powershell 5.1 中执行命令,但当路径包含 Unicode 字符时失败。

例如:

(Get-Acl 'E:/test .txt').access

我是 运行 来自 Node.js 的命令:

let childProcess = require('child_process')
let testProcess = childProcess.spawn('powershell', [])
testProcess.stdin.setEncoding('utf-8')

testProcess.stdout.on('data', (data) => {
  console.log(data.toString())
})

testProcess.stdout.on('error', (error) => {
  console.log(error)
})

// This path is working, I get command output in the console:
// testProcess.stdin.write("(Get-Acl 'E:/test.txt').access\n");

// This path is not working. I get nothing in the console
testProcess.stdin.write("(Get-Acl 'E:/test .txt').access\n");

我无法使用 Powershell 7,因为我正在制作一个 Node.js 在预装的 Powershell 上运行命令的应用程序

更新

这个方法好像行得通:

childProcess.spawn(
  'powershell', 
  ['-Command', '(Get-Acl "E:/test .txt").access']
)

通过 使用 stdin 输入将您的命令提供给 powershell.exeWindows PowerShell CLI你隐含地依赖于系统的活动 OEM 代码页,因为 PowerShell CLI 使用它来解码通过 stdin 接收的输入。

  • 除非您在美式英语系统上明确选择了 , the OEM code page is a fixed single-byte encoding limited to 256 characters that lacks support for most Unicode characters, such as Code page 437

  • 此外,通过 stdin 提供命令(可以使用 -File - 明确请求)意外地使 PowerShell 表现出伪干扰命令输出的交互行为。有关此问题行为的讨论,请参阅GitHub issue #3223 and GitHub issue #15331

相比之下,通过 -c (-Command) CLI 参数 传递命令完全支持 Unicode,不管激活的 OEM 代码页是什么,所以它是一个绕过您原来问题的简单替代方案;借用您自己对问题的更新:

childProcess.spawn(
  'powershell', 
  ['-NoProfile', '-Command', '(Get-Acl "E:/test .txt").access']
)

请注意,我添加了 -NoProfile 以使调用更可预测/加快调用速度,因为此选项会抑制通常仅与 interactive 相关的配置文件的加载使用。