37

PHPで次のようなものが必要です:

If (!command_exists('makemiracle')) {
  print 'no miracles';
  return FALSE;
}
else {
  // safely call the command knowing that it exists in the host system
  shell_exec('makemiracle');
}

解決策はありますか?

4

7 に答える 7

52

Linux / Mac OSの場合これを試してください:

function command_exist($cmd) {
    $return = shell_exec(sprintf("which %s", escapeshellarg($cmd)));
    return !empty($return);
}

次に、コードで使用します。

if (!command_exist('makemiracle')) {
    print 'no miracles';
} else {
    shell_exec('makemiracle');
}

更新: @ camilo-martinによって提案されているように、単純に次を使用できます。

if (`which makemiracle`) {
    shell_exec('makemiracle');
}
于 2012-09-14T12:55:21.157 に答える
14

Windows ではwhere、UNIX システムwhichを使用してコマンドをローカライズできます。コマンドが見つからない場合、どちらも STDOUT に空の文字列を返します。

PHP_OS は現在、PHP がサポートするすべての Windows バージョンで WINNT です。

したがって、ここにポータブルソリューションがあります:

/**
 * Determines if a command exists on the current environment
 *
 * @param string $command The command to check
 * @return bool True if the command has been found ; otherwise, false.
 */
function command_exists ($command) {
  $whereIsCommand = (PHP_OS == 'WINNT') ? 'where' : 'which';

  $process = proc_open(
    "$whereIsCommand $command",
    array(
      0 => array("pipe", "r"), //STDIN
      1 => array("pipe", "w"), //STDOUT
      2 => array("pipe", "w"), //STDERR
    ),
    $pipes
  );
  if ($process !== false) {
    $stdout = stream_get_contents($pipes[1]);
    $stderr = stream_get_contents($pipes[2]);
    fclose($pipes[1]);
    fclose($pipes[2]);
    proc_close($process);

    return $stdout != '';
  }

  return false;
}
于 2013-08-30T19:28:19.503 に答える
4

is_executableを使用 して実行可能かどうかを確認できますが、コマンドを使用して取得できるコマンドのパスを知る必要がありますwhich

于 2012-09-14T12:54:33.653 に答える
3

プラットフォームに依存しないソリューション:

function cmd_exists($command)
{
    if (\strtolower(\substr(PHP_OS, 0, 3)) === 'win')
    {
        $fp = \popen("where $command", "r");
        $result = \fgets($fp, 255);
        $exists = ! \preg_match('#Could not find files#', $result);
        \pclose($fp);   
    }
    else # non-Windows
    {
        $fp = \popen("which $command", "r");
        $result = \fgets($fp, 255);
        $exists = ! empty($result);
        \pclose($fp);
    }

    return $exists;
}
于 2013-03-18T11:12:30.503 に答える
-3

いいえ、ありません。

シェルに直接アクセスできる場合でも、コマンドが存在するかどうかはわかりません。wherisorのようないくつかのトリックがありfind / -name yourcommandますが、コマンドを実行できることを 100% 保証するものではありません。

于 2012-09-14T12:46:07.660 に答える