2012-08-09 36 views
17

パラメータ私はそれがパスだから、それは引数(パス)エスケープ「二重引用符は」

runas /user:abc "icacls %1 /grant Everyone:(F) /T" 

かかりますが、引数%1はすでに"が含まれているバッチスクリプト(に次のように実行したいですコンテキストメニューの[送信先]に引き継がれています - 私はこれをあまり支配しません)。コマンドがバッチスクリプトで実行するとき だから、それは次のように実行します:

runas /user:abc "icacls "c:\folder" /grant Everyone:(F) /T" 

をだから、明らかに私は%1によって作成された" Sをエスケープする必要があります。 %1よりも引用符をエスケープするように文字列操作を実行するにはどうすればよいですか?あなたは\"Hereを使用することができるはず

答えて

20

あなたは置き換える文字列を実行するには便利

を見つけるかもしれないいくつかの他のエスケープ文字を持つサイトです。

set temp=%1 
set temp=%temp:"=\"% 
echo %temp% 
+0

もっと分かりやすいように質問を編集しました – laggingreflex

+5

%1がスペースを含むパスの場合はどうなりますか? –

+0

'' ''の上に '" "を使用するのはいつですか?バッチファイルは本当に' '' 'でエスケープされ、' \ "'バージョンは非バッチプログラム(C++でコード化された '' runas') \をエスケープ文字として認識する言語)。したがって、他のバッチスクリプト(またはバッチ関数(例: 'CALL:function" parameterWith "EscapedQuote" ')に渡すときに、変数を非バッチプログラムと' '" 'に渡すときにのみ' \ "'を使用します) –

1
SET myPath=%1 
SET myPath=%myPath:"=\"% 
runas /user:abc "icacls %myPath% /grant Everyone:(F) /T" 

編集 - 変数名はpathからmyPathに変更されました。 PATHは予約されたシステム変数で、意図したもの以外には使用しないでください。

+2

変数として "path"を使用しないでください。これはWindowsでは特別な目的のために予約されています。値を変更すると、スクリプトの後半で問題が発生する可能性があります。変数名を "path"から他のもの、おそらく "mypath"に変更してください。あなたの答えを編集すれば、私はそれを投票することができます。 – dbenham

0

このような場合には、検索/置換は必要ありません。あなたの議論(元は%~1)から元の引用符を取り除くだけで、必要なものを再度追加することができます。エスケープされた引用符。あなたの例:

runas /user:abc "icacls \"%~1\" /grant Everyone:(F) /T" 
5

それぞれの回答は答えの一部をカバーしています。バックスラッシュ&引用符を使用してそれらを組み合わせる:(ダブル)、それらをエスケープするために引用

runas /user:abc "icacls \"%~1\" /grant Everyone:(F) /T" 

またはあなたが倍増することができます::サイドノート^として


runas /user:abc "icacls ""%~1"" /grant Everyone:(F) /T" 
が脱出のために時折便利です \"あなたが得ます <, |, >, ||, &&&などの特殊文字例:

echo ^| 

これはかなりまれです。

+0

二重引用符が二重引用符では機能しませんが、バックスラッシュは機能しません。 – SerG