5

正規表現に一致するファイルの名前を変更する groovy スクリプトがあります。この方法で起動します

C:\>groovy rename test.* test.txt

それは正常に動作します。

しかし、この正規表現を渡そうとすると:

C:\>groovy rename test\.(.*) $1_TEST_$1

コマンド ラインは次のメッセージを返します。

The syntax of the command is incorrect

それは私のスクリプトではありません- cmdこれを書いているのはそれです。私のスクリプトは決して実行されません。引数(正規表現)を引用符で囲んだ場合でも発生します。

Q:なぜですか? 正規表現をパラメーターとして渡すにはどうすればよいですか?


何が起こっているのか誰にもわからないので、もっと簡単な例を作りました:

test.groovy

println args[0]

私はそれを実行します:groovy test Bobそして、出力は、驚くべきことではありませんBob. しかし、例えば実行するgroovy test .*と、 が得られThe syntax of the command is incorrectます。私がそれを実行するとgroovy test *、pdfファイルの名前が出てきます(たまたま同じディレクトリにありますtest.groovy

4

2 に答える 2

4

OK、これはstartgroovy.batバッチファイルのバグのようです。エラーはここで発生します:

rem remove the leading space we'll add the first time
if "x%_ARG:~0,1%" == "x " set _ARG=%_ARG:~1%

しかし、問題は以前の数行です。

rem remove quotes around first arg
for %%i in (%1) do set _ARG=%_ARG% %%~i

引数にワイルドカードが含まれている場合、これは意図したとおりに機能しません。ワイルドカードが正常に一致するため、特定のケース(単一のアスタリスクを含む)はスクリプトの早い段階で回避され、他のケースは一種の作業です。この場合、エラーは発生しませんが、一致するファイルはワイルドカードではなくGroovyスクリプトに渡されます。ワイルドカードが一致するが、回避策によってワイルドカードが破損しているために一致しない場合もあります。

私が理解できる限りでは、ワイルドカードを処理しないことを目的としているため、修正は簡単です。

rem remove quotes around first arg
for /F %%i in (%1) do set _ARG=%_ARG% %%~i

今それは私のために働きます:

H:\>groovy test .*
.*

バグレポートを提出するつもりでしたが、プロジェクトのWebサイトに登録しないと提出できないようですので、よろしければ提出してください。

サイドノート:

この問題はバグが原因で発生しますstartgroovy.batが、Windowsバッチプロセッサのバグ(または少なくとも奇妙な動作)も明らかになります。変数が存在しない場合、環境変数の部分文字列展開は奇妙な動作をします。上記のif行は、コマンドラインでは期待どおりに機能します(環境変数の置換はありません)が、バッチファイルでは、次のように壊れてしまいます。

if "x~0,1_ARG:~1

したがって、構文エラー。

于 2012-10-07T21:22:42.690 に答える
0

groovy のコンパイル オプションを確認します。これは、stdlib パーサーが正規表現をワイルドカード展開する原因となる、wildargs を使用してコンパイルされる可能性があります。

于 2012-10-05T16:22:53.207 に答える