2016-06-19 12 views
1

Perl MSIをサイレントインストールするバッチファイルを作成したいと思います。ただし、サーバー/ PCにPerlがインストールされている場合、バッチファイルのフローは次のようになります。perlがWindowsコマンドであるかどうかを確認するには?

  1. Perlがインストールされているかどうかを確認します。
  2. インストールされていない場合は、サイレントモードでインストールしてください。

私はPerlはインストールされている場合、コマンドperl-vはPerlのバージョンを報告することを知っているが、perlコマンドは、Windowsのバッチファイルによって、サーバ/ PC上で実行可能であるかどうかを確認する方法のアイデアを持っていません。

+1

http://stackoverflow.com/questions/4781772/how-to-test-if-an-executable-exists-in-the-path-from-a-windows-batch-file – stevieb

+1

* "インストールされていない場合、それを静かにインストールしてください "*特に、' 'あなたはPerlをインストールしますか? 'というプロンプトが表示されていないので、それについてはわかりません。インストールが適切でないかもしれない状況がいくつかあります。また、既にコピーがインストールされているか、 'perl.5.24.0.exe'のような別のファイル名でPATHに存在することさえあります。ユーザーは自分のPCを制御したままにしておく必要があります。 – Borodin

+0

ユーザーの同意なしにプログラムをインストールすることは、良好な市民権ではありません。ウイルスはそれを行います。ウイルスにならないでください。 – lit

答えて

3

おそらくHow do I get the application exit code from a Windows command line?Redirect Windows cmd stdout and stderr to a single fileが役に立ちます。

ランは

perl -e1 2>NUL 
if errorlevel 1 (
    echo Perl is not installed 
) 

perl -e1単にPerlがインストールされている場合、常に成功するワンライナーとしてPerlの式1を実行します。それはPerlが見つからないときに不平を言うことを除いて、全く出力を生成しません。だから、STDERRをNULにリダイレクトしたので、エラーメッセージでなくても出力が見えなくなったのです。

if errorlevel 1は、最後のコマンド(この場合はperl -e1)のリターンコードが>=1であったかどうかを確認します。 Perlがインストールされて実行可能であれば、その戻りコードは0(成功を意味する)になり、ifはトリガーしません。

perl -vでもを使用して、がSTDOUTに出力することもできます。その場合は、STDOUTとSTDERRの両方をNULにリダイレクトする必要があります。つまり、perl -v >NUL 2>&1です。

+2

これは、 "実行するために存在しないコマンドが入力された場合、ERRORLEVEL = 9009" _を設定したために機能します。さらなる詳細[ここ](http://stackoverflow.com/questions/34987885/what-are-the-errorlevel-values-set-by-internal-cmd-exe-commands/34987886#34987886) – Aacini

0
>nul 2>nul where perl || echo not installed 

これは、perlを実行しようとせずにperlをチェックします。

%PATH%にリストされているフォルダでファイル/コマンドが見つかった場合はSTDOUTに出力し、そうでない場合はSTDERRに出力します。

関連する問題