Mingw32/Msys は引数を間違えずに dos/cmd.exe 実行ファイルを実行できますか?

Mingw32/Msys は引数を間違えずに dos/cmd.exe 実行ファイルを実行できますか?

Windows bash プロンプトから growlnotify.exe を実行しようとしています。mingw32 用に再コンパイルするのは、私にとっては良い選択肢ではありません。

growlnotify は、cmd プロンプトから使用すると動作しますが、bash プロンプトから使用すると (ほとんどの場合) 失敗します。スイッチのない引数 (通知メッセージ) を 1 つだけ受け取ることができるようです。引数が 1 つ以上ある場合は、何も表示されずに失敗します。スイッチが 1 つあり、他の引数がない場合、そのスイッチがメッセージとして送信されます。

Google で、Windows が実際の tty を提供しないことと関係があるというヒントをいくつか見つけましたが、修正方法はありません。これを強制的に動作させる賢い方法はあるでしょうか? 期待どおりに動作するように引数を正しくエスケープする方法はありますか?

新情報:

3 つのスラッシュを使用して実行すると、引数は無視されます。一方、DOS の正しい形式で実行すると、何も表示されずに失敗します。

失敗 (// を使用した場合も失敗します):

growlnotify /a:'Application Name' /n:'Notification Type' 'message goes here'

しかしこれは:

growlnotify ///a:'Application Name' ///n:'Notification Type' 'message goes here'

この場合は、「ここにメッセージがあります」という通知が送信されますが、最初の 2 つの引数を含めなかったかのようになります。ただし、スラッシュが 1 つまたは 2 つある場合は、通知は送信されません (引数をまったく含めなかったかのように)。

4 重スラッシュと 5 重スラッシュは、3 重スラッシュと同じように動作します。

各種スイッチの説明

答え1

はい、正しい答えは次です。

DOS 実行可能ファイルを使用できるように引数をエスケープするには、次のようにスラッシュを 2 重にします。

growlnotify //a:Application //t:Title "message here"

私の場合、失敗した理由は、どういうわけか前日に開始したときと同じアプリケーション名を使用していなかったためです (別のアプリケーションとして登録されておらず、Growl For Windows は未登録の通知を無視します)。

他にも言及する価値のあるトリックがいくつかあります。CMD では、次のようなステートメントを発行できます。

growlnotify //a:App //t:"With Spaces" "message here"

「スペースあり」は爆弾です。msys/bash は引用符を展開してそれを渡すので、実行ファイルは 2 つの引数を見ることになります。//t:とそしてスペース"正しい方法は次のとおりです。

growlnotify //a:App //t:With\ Spaces "message here"

また、ファイルパスを渡す場合は、DOS スタイル、つまりスラッシュを使用する必要があります (最終的には、DOS のような実行ファイルがそれを使用するため)。ただし、これらはエスケープとして解釈されるため、2 重にする必要があります。

growlnotify //a:App //ai:C:\\path\\to\\icon.png "message here"

これが将来誰かの役に立つことを願っています。

答え2

MinGW から「cmd.exe /c growlnotify.exe ...」を実行してみましたか?

関連情報