diff --git a/Web/Util/Shell/Shell.php b/Web/Util/Shell/Shell.php index 2bf1e214..d3f58165 100644 --- a/Web/Util/Shell/Shell.php +++ b/Web/Util/Shell/Shell.php @@ -11,17 +11,39 @@ class Shell $functions = array_map(function($x) { return trim($x); }, explode(" ", ini_get("disable_functions"))); - return !in_array("system", $functions); + if(in_array("system", $functions)) + return FALSE; + + if(Shell::isPowershell()) { + exec("WHERE powershell", $_x, $_c); + unset($_x); + + return $_c === 0; + } + + return TRUE; + } + + static function isPowershell(): bool + { + return strncasecmp(PHP_OS, 'WIN', 3) === 0; } static function commandAvailable(string $name): bool { if(!Shell::shellAvailable()) throw new Exceptions\ShellUnavailableException; - + + if(Shell::isPowershell()) { + exec("WHERE $name", $_x, $_c); + unset($_x); + + return $_c === 0; + } + return !is_null(`command -v $name`); } - + static function __callStatic(string $name, array $arguments): object { if(!Shell::commandAvailable($name)) @@ -41,14 +63,25 @@ class Shell function execute(?int &$result = nullptr): string { $stdout = []; - exec($this->command, $stdout, $result); + + if(Shell::isPowershell()) { + $cmd = escapeshellarg($this->command); + exec("powershell -Command $this->command", $stdout, $result); + } else { + exec($this->command, $stdout, $result); + } return implode(PHP_EOL, $stdout); } function start(): string { - system("nohup " . $this->command . " > /dev/null 2>/dev/null &"); + if(Shell::isPowershell()) { + $cmd = escapeshellarg($this->command); + pclose(popen("start /b powershell -Command $this->command", "r")); + } else { + system("nohup " . $this->command . " > /dev/null 2>/dev/null &"); + } return $this->command; }