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

ha5z0ras  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(277)

我需要将文件名作为输入传递给包含空格的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

PowerShell中echo "a c"的实际输出是一行中的a c。换行只发生在没有双引号的情况下。
仅作为实验,我也尝试了""a c"",预期的输入与change line,a,change line,c相同。随着返回,似乎任何和所有的双引号都被MatLab活生生地“吃掉”了。
在使用system()时如何恢复双引号?

xt0899hw

xt0899hw1#

PowerShell吞噬了你的双引号:

  • 您正在通过-Command(-c)参数(在您的例子中是位置暗示的)向PowerShell CLI**传递一个命令(PowerShell代码片段)。
  • "个应视为命令的字符必须转义为*\"**(原文如此)
    未转义的"不起作用的原因是,PowerShell认为它们只有在命令行上才有语法功能--它们在所有参数都被解析后被简单地剥离*;然后,产生的标记用空格连接,结果字符串最终被解释为PowerShell代码。
  • 虽然在命令中只使用*\"就可以解决问题,但**建议您将正在传递的整个命令括在"..."**中,因为这样可以防止可能不需要的空格标准化
system('powershell.exe " echo \"a c\" "', '-echo')
  • 警告*:
  • 由于matlab的system()函数通过cmd.exe执行给定的命令行(在您的情况下效率很低,因为您不需要外壳功能),因此使用\"可能会“中断”调用,这是因为cmd.exe解析命令行的方式。
  • 为了避免涉及cmd.exe的边缘情况,将整个命令包含在"...."中,并转义通过",如下所示:
  • 调用powershell.exe(Windows PowerShellCLI)时使用**"^""**(原文如此)
  • 调用pwsh.exe(PowerShell(Core)7+CLI)时使用""**。
  • 有关详细信息,请参阅this answer

相关问题