#php
#php
Вопрос:
file_exists()
проверяет, существует ли файл.
Однако «pg_ctl» является допустимой командой в моей системе, потому что C:PostgreSQLbin
находится в моей PATH
, поэтому запуск «pg_ctl» действительно выполняется C:PostgreSQLbinpg_ctl.exe
.
file_exists
сообщит, что «pg_ctl» не существует, но он все еще «вроде» существует, поскольку он может выполняться.
Как мне проверить, преобразуется ли заданный путь ИЛИ строка, такая как «pg_ctl», в допустимую команду?
Я уже пробовал с realpath
. Она возвращает логическое значение false для realpath('pg_ctl')
, так что это не работает.
Комментарии:
1. Смотрите is_executable() .
2. @AlexHowansky
var_dump(is_executable('pg_ctl'));
=bool(false)
3.
is_executable()
требуется полный путь к файлу (иначе он выглядит в текущем каталоге) — он не будет пересекать ваш ПУТЬ. PHP не заботится о вашем пути (или не знает о нем) — это особенность оболочки, а не PHP. Если вы хотите просмотреть каталоги в пути, вам нужно будет сделать это самостоятельно.4. @AlexHowansky Весь смысл был в том, чтобы проверить наличие команды…
5. PHP не является оболочкой, он не имеет понятия о том, что такое «команда». Вместо командной строки exec (чего вам никогда не следует делать) вам придется написать код для разделения ПУТИ по двоеточию, выполнить итерацию по каталогам и запустить is_executable() для имени команды, как если бы это был файл в этом каталоге.
Ответ №1:
В Windows вы можете использовать where.exe
который вернет путь к файлу, если он существует в path.
shell_exec('where pg_ctl');
Должен вернуться:
C:PostgreSQLbinpg_ctl.exe
Поэтому проверьте наличие этого в выходных данных:
$cmd = 'pg_ctl';
var_dump( strpos(shell_exec("where $cmd"), $cmd) !== false );
Комментарии:
1. @AlexHowansky ИНФОРМАЦИЯ: Не удалось найти файлы для данного шаблона (ов). но, как и во всем, не доверяйте пользовательскому вводу, но, похоже, в этом вопросе это не так.
2. Она по-прежнему выполняет вторую команду после генерации этого сообщения об ошибке. Попробуйте
where foo amp; bar
, и вы получите информационное сообщение, а затем сообщение об ошибке о невозможности запуска bar.3. @AlexHowansky Я знаю концепцию, но мой
c:
все еще не поврежден 😉4. Если я правильно помню (прошло некоторое время), формат запрашивает подтверждение пользователя по умолчанию, и есть переключатель типа
y
, чтобы пропустить его, но я не собираюсь это проверять. 🙂