Вывод Powershell в переменную PHP с помощью Shell exec
У меня есть скрипт powershell, который выводит длительность видеофайла. Запуск этого скрипта дает мне ожидаемый результат.
$Folder = 'C:mypathtofolder'
$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:mypathtopsFile.ps1 2>&1");
echo "<pre>$var</pre>";
?>
Строковый вывод, который я получаю из shell_exec, - это текст, который вы видите при запуске powershell из cmd. Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. Все права защищены. Есть ли какие-либо предложения о том, как извлечь длительность видео?
1 ответ:
Используя ваш 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
Comments