如何在Windows 10中的cmd中保留多个空格作为powershell的字符串参数



我正试图通过cmd运行一个带有多个字符串参数的powershell命令。

上下文是我想使用Matlab函数/脚本中的Compress-Archivecmdlet。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'被逐字拆分为'ab'

然后将生成的令牌与单个空格连接,以形成的单个字符串,然后将其解释为PowerShell代码并执行。

正是在通过空格(可以是令牌之间的任何个空格(进行拆分的过程中,丢失了关于标记之间有多少空格的信息。

只有在"..."封闭的令牌中才保留了空白,因此在上面的整个命令中使用了"..."

如果需要使用"引用作为PowerShell命令的一部分(使用字符串插值(,则必须将"字符转义为",如顶部的第二个命令所示。但是,如果从cmd.exe/批处理文件调用,则由于cmd.exe解析命令行的方式,这可能会中断。在这种边缘情况下,请使用本答案中讨论的解决方法

最新更新