我正在尝试通过 cmd 运行带有多个字符串参数的 powershell 命令。
上下文是我想使用 Compress-Archive
来自 Matlab 函数/脚本的 cmdlet。而Matlab只能访问cmd。
但是在调用powershell.exe
时我找不到在字符串参数中保留连续空格的方法在命令中。
C:\Users\Artus>powershell.exe echo 'a c'
a c
C:\Users\Artus>powershell.exe echo \"a c\"
a c
C:\Users\Artus>powershell.exe echo `"a c`"
c`
C:\Users\Artus>powershell.exe echo \"`'a c`'\"
'a c'
我尝试调整 this 的答案, this和 this问题,但没有任何效果。
在向 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\" "
也就是说,将整个命令括在“...”
中是必要的,以避免您看到的空白规范化。
当您将命令(一段 PowerShell 代码)传递给 PowerShell 时 CLI ,通过 -Command
(-c
) 参数(在您的情况下是位置隐含的),PowerShell 执行以下命令行解析< em>首先,将命令行拆分为:
- 空格分隔的标记
- 双引号标记(
"..."
)即使包含空格也会被识别为单个标记,并且内部空间按原样保留;请注意,这些(未转义的)"
在此过程中被删除)。- 注意:相比之下,
'...'
封闭的 token 不会在命令行上被识别为单个 token (即使在 PowerShell session 中它们也是如此) ,以便将'a b'
拆分为逐字'a
和b'
。
- 注意:相比之下,
然后将生成的标记与单个空格连接以形成单个字符串,然后将其解释为 PowerShell 代码并执行。
正是在按空格(标记之间可以是任意个空格)进行分割的过程中,有关标记之间有多少空格的信息会丢失。
只有在 "..."
封闭的标记内,空格才会按原样保留,因此在上面的整个命令周围使用 "..."
。
如果您需要使用 "
引用作为 PowerShell 命令的一部分(以使用字符串插值),"
字符必须转义为 \"
,如顶部的第二个命令所示。
但是,如果您从 cmd.exe
/批处理文件调用,则可能会中断,因为 cmd.exe
解析命令行。在此类极端情况下,请使用 this answer 中讨论的解决方法。 .
关于powershell - 如何在 Windows 10 的 cmd 中保留多个空格作为 powershell 的字符串参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73308002/