2017-02-17 8 views
2

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

$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 Copyright (C) 2016 Microsoft Corporation. Все права защищены. Любые предложения по извлечению продолжительности видео?

+1

Что произойдет, если вы добавляете '-NoLogo' вашу команду PowerShell в' shell_exec() '? –

+0

«powershell -NoLogo -File ...» - дает тот же результат – Thomas

+0

Это говорит о том, что что-то о том, как 'shell_exec()' обрабатывает командную строку, которую вы передаете, является ... нечетным. Если вы добавляете код в свой скрипт для вывода результатов в файл, создается ли файл и он содержит то, что вы ожидаете от него? –

ответ

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 
+0

Отлично! Это была комбинация избежания пути Windows и «-ExecutionPolicy Bypass» вместе, что заставило его пройти. Я пробовал их отдельно, но не вместе. Спасибо :) – Thomas