如何在 powershell 中运行 CMD 命令而不转义特殊字符?

如何在 powershell 中运行 CMD 命令而不转义特殊字符?

我正在尝试将其用作PowerShell我的默认 shell,而不是cmd

但是一些简单的 cmd 命令被 powershell 预处理并且被破坏,例如:

PS C:\git\myproject> git stash show stash@{0}

Too many revisions specified: 'stash@' 'MAA=' 'xml' 'text'

这里,{0}将 Powershell 替换为其他内容。

CMD在没有 PowerShell 预处理的情况下启动命令的更实用的方法是什么(即用最少的转义努力) ?

现在我正在使用

PS C:\git\myproject> cmd /c 'git stash show stash@{0}'

但在我看来,它有太多额外的按键,不值得切换。

答案1

如果您使用特殊字符引用参数, Powershell 将运行git,并且任何其他基于 cmd 的功能将不会出现任何问题,如下所示:

git stash show 'stash@{0}'

更加简单、更加干净。

单引号强制所有内容为文字,包括转义字符。双引号只会解析和阻止$用于变量的 ,。引号字符本身会被解析和删除,因此git除非手动转义,否则永远不会看到它们。

答案2

正如评论中所说,我刚刚发现停止解析符号 --%

git --% stash show stash@{0}

PowerShell 3.0 中引入的停止解析符号 (--%) 指示 PowerShell 不要将输入解释为 PowerShell 命令或表达式。

在 PowerShell 中调用可执行程序时,请将停止解析符号放在程序参数之前。此技术比使用转义字符更容易防止误解。

当遇到停止解析符号时,PowerShell 会将行中的剩余字符视为文字。它执行的唯一解释是将值替换为使用标准 Windows 表示法(例如 %USERPROFILE%)的环境变量。

停止解析符号仅在下一个换行符或管道符之前有效。您不能使用延续符 (`) 来延长其效果,也不能使用命令分隔符 (;) 来终止其效果。

相关内容