使用shell_exec

时间:2017-02-17 12:58:53

标签: php powershell 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获得的字符串输出是您从cmd启动PowerShell时看到的文本。 Windows PowerShell 版权所有(C)2016 Microsoft Corporation。保留所有权利。有关如何提取视频时长的任何建议?

1 个答案:

答案 0 :(得分: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