如何在 Matlab 的 system() 命令中包含双引号

Arg*_*yll 6 windows powershell matlab cmd windows-10

我需要将文件名作为输入传递给包含空格的 powershell 命令。因此我希望包含双引号。

然而,当将参数传递给 powershell 时,Matlab 会“吃掉”输入中的所有双引号system()

例如,请注意下面的示例如何具有相同的输出。

>> system('powershell.exe echo a c','-echo')
a 
c 
ans =
     0
>> system('powershell.exe echo "a c"','-echo')
a 
c 
ans =
     0
>> system('powershell.exe echo ""a c""','-echo')
a 
c 
ans =
     0
>> system(['powershell.exe echo ',char(34),'a c',char(34)],'-echo')
a 
c 
ans =
     0
Run Code Online (Sandbox Code Playgroud)

echo "a c"powershell 中的实际输出a c位于一行中。换行仅在没有双引号的情况下发生。

只是为了实验,我也尝试过""a c"",预期输入与更改行,a,更改行,c 相同。随着返回,似乎所有双引号都被 Matlab 活活“吃掉”了。

使用时如何恢复双引号system()

mkl*_*nt0 4

PowerShell正在吃掉你的双引号:

  • 通过-Command( -c) 参数(在您的情况下在位置上隐含)将命令(一段 PowerShell 代码)传递到 PowerShell CLI

  • "应被视为命令一部分的 字符必须转义为 \"(sic)

    • 未转义 不起作用的原因是 PowerShell 认为它们仅在命令行上"具有语法功能-在解析所有参数后,它们会被简单地删除;然后将生成的标记与空格连接,生成的字符串最终解释为 PowerShell 代码。
  • 虽然仅 在命令中使用\"可以解决问题,但建议包含传入的整个"..."命令,因为这可以防止潜在不需要的空白规范化

system('powershell.exe " echo \"a c\" "', '-echo')
Run Code Online (Sandbox Code Playgroud)

警告

  • 由于 MatLab 的system()函数通过 via 执行给定的命令行cmd.exe(这在您的情况下效率低下,因为您不需要 shell 功能),由于s 如何解析命令行,使用\"可能会中断调用。cmd.exe

  • 为了避免涉及时出现边缘情况cmd.exe,请将整个命令括起来"...."并转义传递,"如下所示:

    • 调用(Windows PowerShell CLI)"^""时使用(原文如此)powershell.exe
    • ""调用时使用pwsh.exePowerShell (Core) 7+ CLI)。
    • 请参阅此答案以获取更多信息。