我正在尝试将其用作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%)的环境变量。
停止解析符号仅在下一个换行符或管道符之前有效。您不能使用延续符 (`) 来延长其效果,也不能使用命令分隔符 (;) 来终止其效果。