我正试图通过cmd运行一个带有多个字符串参数的powershell命令。
上下文是我想使用Matlab函数/脚本中的Compress-Archive
cmdlet。Matlab只能访问cmd。
但是在cmd中调用powershell.exe
时,我找不到在字符串参数中保留连续空格的方法。
C:UsersArtus>powershell.exe echo 'a c'
a c
C:UsersArtus>powershell.exe echo "a c"
a c
C:UsersArtus>powershell.exe echo `"a c`"
c`
C:UsersArtus>powershell.exe echo "`'a c`'"
'a c'
我试着调整这个、这个和这个问题的答案,但都没有奏效。
向powershell.exe传递参数时,如何避免删除连续空格?有没有一种方法可以要求powershell.exe接受参数作为字符串文字?
为Theo的有效解决方案添加解释:
# Use of "..." around the entire argument is the key.
# (The extra space before and after the command is just for visual clarity.)
powershell.exe " echo 'a c' "
# Alternative with embedded double-quoting
powershell.exe " echo "a c" "
也就是说,在"..."
中封装整个命令对于避免您看到的空白规范化是必要的
当您通过-Command
(-c
(参数(在您的情况下是位置隐含的(将命令(PowerShell代码段(传递给PowerShell CLI时,PowerShell首先执行以下命令行解析,方法是将命令行拆分为:
- 空白分隔的令牌
- 双引号标记(
"..."
(被识别为单个标记,即使它们包含空间,内部空间也保持原样;请注意,这些(未缩放的("
在过程中被移除(。- 注意:相比之下,
'...'
封闭的令牌在命令行上不被识别为单个令牌(即使在PowerShell会话中它们是(,因此'a b'
被逐字拆分为'a
和b'
- 注意:相比之下,
然后将生成的令牌与单个空格连接,以形成的单个字符串,然后将其解释为PowerShell代码并执行。
正是在通过空格(可以是令牌之间的任何个空格(进行拆分的过程中,丢失了关于标记之间有多少空格的信息。
只有在"..."
封闭的令牌中才保留了空白,因此在上面的整个命令中使用了"..."
。
如果需要使用"
引用作为PowerShell命令的一部分(使用字符串插值(,则必须将"
字符转义为"
,如顶部的第二个命令所示。但是,如果从cmd.exe
/批处理文件调用,则由于cmd.exe
解析命令行的方式,这可能会中断。在这种边缘情况下,请使用本答案中讨论的解决方法。