У меня есть следующая проблема:
У меня запущен сервер xampp, и я хочу, чтобы он выполнял powershell. PHP запускает файл .bat, который содержит следующий код:
@echo
cd C:\OpenBR\bin
start /WAIT br -algorithm FaceRecognition -compare C:\xampp\htdocs\upload C:\xampp\htdocs\DP C:\xampp\htdocs\results\result.csvstart /WAIT C:\xampp\htdocs\CSVconvert\sortieren.ps1
start /WAIT C:\xampp\htdocs\CSVconvert\Removedouble.ps1
start /WAIT C:\xampp\htdocs\CSVconvert\remove_path.ps1
start /WAIT C:\xampp\htdocs\CSVconvert\remove_foo.ps1
start C:\xampp\htdocs\CSVconvert\remove_quoatation.ps1
Первая часть работает отлично, вплоть до того момента, когда я захочу выполнить команду powershell «sortieren.ps1». Когда я запускаю пакет вручную, он выполняется и выполняет задание, а при запуске через php — нет.
Я установил «Set-ExecutionPolicy Unrestricted» в оболочках x86 и x64.
Я просто сбит с толку, потому что нормальная командная строка работает, а powershell — нет, даже после того, как ее установили без ограничений.
Я смотрел
выполнение скрипта Powershell из php
а также
PowerShell в Windows 7: Set-ExecutionPolicy для обычных пользователей
но не смог решить проблему.
Что я упустил?
Сеанс, в котором вы выполняете эти команды, не имеет тех же переменных окружения, что и при использовании PowerShell для их запуска вручную. Вам нужно будет указать абсолютный путь к исполняемой программе PowerShell и сценариям, которые вы хотите запустить, чтобы они были найдены.
start /WAIT C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe C:\xampp\htdocs\CSVconvert\sortieren.ps1
Поскольку проблема заключалась в среде, я подумал, что вы могли бы извлечь выгоду из пакета, который обрабатывает этот аспект автоматически. Вот проект, который позволяет PHP получить и динамически взаимодействовать с реальным Powershell. Получи это здесь: https://github.com/merlinthemagic/MTS
После загрузки вы просто используете следующий код:
$shellObj = \MTS\Factories::getDevices()->getLocalHost()->getShell('powershell');
$strCmd1 = 'first command from first script';
$return1 = $shellObj->exeCmd($strCmd1);
$strCmd2 = 'second command from first script';
$return2 = $shellObj->exeCmd($strCmd2);
Вместо запуска одного скрипта вы можете просто запустить каждую команду в отдельности и обработать возврат. Вы можете использовать любую команду, которая вам нравится, в отношении $ shellObj, среда поддерживается в течение всего срока действия сценария PHP.