24

引数(パス)を取るバッチスクリプトで以下を実行したい

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

しかし、引数%1にはすでに" (パスであるため、コンテキストメニューの[送信先]から渡されます-これをあまり制御できません)。したがって、コマンドをバッチスクリプトで実行すると、次のように実行されます。

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

したがって、明らかに、"によって作成されたをエスケープする必要があり%1ます。%1引用符をエスケープするように文字列操作を実行するにはどうすればよいですか?

4

5 に答える 5

25

使用できるはずです\" ここにあなたが役に立つかもしれない他のいくつかのエスケープ文字があるサイトがあります

文字列置換を実行するには:

set temp=%1
set temp=%temp:"=\"%
echo %temp%
于 2012-08-09T23:15:10.577 に答える
6

各回答は回答の一部をカバーしています。バックスラッシュと引用符を使用してそれらを組み合わせると、次の\"ようになります。

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

または、引用符を2倍(二重)にしてエスケープすることもできます。

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

補足として、、、、、、、などの特殊文字をエスケープする場合に^役立つことがあります。次に例を示します。<|>||&&&

echo ^|

しかし、これは非常にまれです。

于 2014-03-05T04:02:41.143 に答える
2
SET myPath=%1
SET myPath=%myPath:"=\"%
runas /user:abc "icacls %myPath% /grant Everyone:(F) /T"

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

于 2012-08-09T23:56:58.413 に答える
0

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

runas /user:abc "icacls \"%~1\" /grant Everyone:(F) /T"
于 2012-08-12T07:02:19.677 に答える
0

いくつかの簡単なテストの後、これが最良の方法です。

逆さま

  • タスクリストから出力された複数の結果を処理します
  • 必要に応じてスペース付きのアプリケーション名を処理します
  • 大文字と小文字を区別する/区別しないように簡単に変更できます

欠点

  • 技術的に遅い複数のコマンドを呼び出す

コード

@echo off    
set "EXE=authy desktop.exe"
tasklist /NH /FI "imagename eq %EXE%" | find /i "%EXE%" >nul 2>&1
If %errorlevel% EQU 0 (
    echo %EXE% Is Running
) ELSE (
    echo %EXE% is Not Running
)

さらなる考察

を&&()に変更できます|| ()エラーレベルをチェックする代わりにフォーマットします。また、!errorlevel!で参照することにより、errorlevelが複数回使用される場合は、「setlocalenabledelayedexpansion」を使用できます。

tasklist /NH /FI "imagename eq %EXE%" | find /i "%EXE%" >nul 2>&1 && (
    echo %EXE% Is Running
) || (
    echo %EXE% is Not Running
)
于 2021-08-21T19:37:51.880 に答える