PowerShell
の代わりにcmd
をデフォルトのシェルとして使用しようとしています。
ただし、いくつかの簡単なcmdコマンドは、PowerShellによって前処理され、壊れています。
PS C:\git\myproject> git stash show stash@{0}
Too many revisions specified: 'stash@' 'MAA=' 'xml' 'text'
ここで、{0}
はPowershellによって別のものに置き換えられます。
PowerShellの前処理なしでCMD
コマンドを起動するためのより実用的な方法(つまり、エスケープの労力を最小限に抑える方法)は何ですか?
今使っています
PS C:\git\myproject> cmd /c 'git stash show stash@{0}'
しかし、私見では、追加のキーストロークが多すぎて、スイッチを価値のあるものにすることができません。
次のような特殊文字でパラメーターを引用すると、Powershellはgit
およびその他のcmdベースの関数を問題なく実行します。
git stash show 'stash@{0}'
はるかに簡単でクリーン。
一重引用符は、エスケープ文字を含むすべてをリテラルにすることを強制します。二重引用符は、変数に使用される$
でのみ解析およびチョークします。引用符自体が解析および削除されるため、手動でエスケープしない限り、git
は引用符を認識しません。
コメントで述べたように、私は 構文解析の停止記号--%
を見つけました:
git --% stash show stash@{0}
PowerShell 3.0で導入された解析停止記号(-%)は、入力をPowerShellコマンドまたは式として解釈しないようにPowerShellに指示します。
PowerShellで実行可能プログラムを呼び出すときは、プログラム引数の前に解析停止記号を配置します。この手法は、誤解を防ぐためにエスケープ文字を使用するよりもはるかに簡単です。
解析停止記号が検出されると、PowerShellは行の残りの文字をリテラルとして扱います。実行される唯一の解釈は、%USERPROFILE%などの標準のWindows表記を使用する環境変数の値を置き換えることです。
解析停止記号は、次の改行またはパイプライン文字までのみ有効です。継続文字( `)を使用してその効果を拡張したり、コマンド区切り文字(;)を使用してその効果を終了したりすることはできません。