Вывод Powershell в переменную PHP с помощью shell exec


У меня есть скрипт powershell, который выводит длительность видеофайла. Запуск этого скрипта дает мне ожидаемый результат.

$Folder = 'C:\my\path\to\folder'
$File = 'sample1_1280_720.mp4'
$LengthColumn = 27
$objShell = New-Object -ComObject Shell.Application 
$objFolder = $objShell.Namespace($Folder)
$objFile = $objFolder.ParseName($File)
$Length = $objFolder.GetDetailsOf($objFile, $LengthColumn)
Write-Output $Length

В php-файле я пытаюсь сохранить этот вывод в переменную.

<?php
$var = shell_exec("powershell -File C:\my\path\to\psFile.ps1 2>&1");
echo "<pre>$var</pre>";
?>

Строковый вывод, который я получаю от shell_exec, - это текст, который вы видите при запуске powershell из cmd. Windows PowerShell (Windows PowerShell) Авторское право (C) 2016 Корпорация Майкрософт. Все права защищены. Есть какие-либо предложения о том, как извлечь продолжительность видео?

Author: Thomas, 2017-02-17

1 answers

Используя свой PS-код

$Folder = 'C:\my\path\to\folder'
$File = 'sample1_1280_720.mp4'
$LengthColumn = 27
$objShell = New-Object -ComObject Shell.Application
$objFolder = $objShell.Namespace($Folder)
$objFile = $objFolder.ParseName($File)
$Length = $objFolder.GetDetailsOf($objFile, $LengthColumn)
$Length

Я могу получить длину файла, используя PS -File и -Command. Я добавил несколько других флагов, которые могут вам понадобиться или понадобиться. Вам не нужно использовать перенаправление 2>&1, чтобы перевести вашу переменную из PS в PHP. Скорее всего, это причина, по которой вы получаете логотип.

function PowerShellCommand($Command)
{
    $unsanitized = sprintf('powershell.exe -NonInteractive -NoProfile -ExecutionPolicy Bypass -Command "%s"', $Command);

    return shell_exec($unsanitized);
}

function PowerShellFile($File)
{
    $unsanitized = sprintf('powershell.exe -NonInteractive -NoProfile -ExecutionPolicy Bypass -File "%s"', $File);

    return shell_exec($unsanitized);
}

// Can use relative paths
echo PowerShellCommand("./psFile.ps1");
// Be sure to escape Windows paths if needed
echo PowerShellFile("C:\\my\\path\\to\\folder\\psFile.ps1");

Возвращение $Length всеми тремя способами работает для меня

$Length
return $Length
Write-Output $length 
 1
Author: Xainey, 2017-02-17 14:29:53