我需要将文件名作为输入传递给包含空格的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()
时如何恢复双引号?
1条答案
按热度按时间xt0899hw1#
是PowerShell吞噬了你的双引号:
-Command
(-c
)参数(在您的例子中是位置暗示的)向PowerShell CLI**传递一个命令(PowerShell代码片段)。"
个应视为命令的字符必须转义为*\"
**(原文如此)未转义的
"
不起作用的原因是,PowerShell认为它们只有在命令行上才有语法功能--它们在所有参数都被解析后被简单地剥离*;然后,产生的标记用空格连接,结果字符串最终被解释为PowerShell代码。\"
就可以解决问题,但**建议您还将正在传递的整个命令括在"..."
**中,因为这样可以防止可能不需要的空格标准化。system()
函数通过cmd.exe
执行给定的命令行(在您的情况下效率很低,因为您不需要外壳功能),因此使用\"
可能会“中断”调用,这是因为cmd.exe
解析命令行的方式。cmd.exe
的边缘情况,将整个命令包含在"...."
中,并转义通过"
,如下所示:powershell.exe
(Windows PowerShellCLI)时使用**"^""
**(原文如此)pwsh.exe
(PowerShell(Core)7+CLI)时使用""
**。