web-dev-qa-db-ja.com

特別な文字をエスケープせずにPowerShellでCMDコマンドを実行するにはどうすればよいですか?

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}'

しかし、私見では、追加のキーストロークが多すぎて、スイッチを価値のあるものにすることができません。

1

次のような特殊文字でパラメーターを引用すると、Powershellはgitおよびその他のcmdベースの関数を問題なく実行します。

git stash show 'stash@{0}'

はるかに簡単でクリーン。

一重引用符は、エスケープ文字を含むすべてをリテラルにすることを強制します。二重引用符は、変数に使用される$でのみ解析およびチョークします。引用符自体が解析および削除されるため、手動でエスケープしない限り、gitは引用符を認識しません。

1
user19702

コメントで述べたように、私は 構文解析の停止記号--%を見つけました:

git --% stash show stash@{0}

PowerShell 3.0で導入された解析停止記号(-%)は、入力をPowerShellコマンドまたは式として解釈しないようにPowerShellに指示します。

PowerShellで実行可能プログラムを呼び出すときは、プログラム引数の前に解析停止記号を配置します。この手法は、誤解を防ぐためにエスケープ文字を使用するよりもはるかに簡単です。

解析停止記号が検出されると、PowerShellは行の残りの文字をリテラルとして扱います。実行される唯一の解釈は、%USERPROFILE%などの標準のWindows表記を使用する環境変数の値を置き換えることです。

解析停止記号は、次の改行またはパイプライン文字までのみ有効です。継続文字( `)を使用してその効果を拡張したり、コマンド区切り文字(;)を使用してその効果を終了したりすることはできません。

0