Отдельный вывод Powershell в выпадающем меню - PullRequest
2 голосов
/ 14 февраля 2020

Я получаю информацию о своем принтере из следующей команды Powershell:

<?php
$Comment = Shell_Exec ('powershell.exe -Command "Get-Printer -ComputerName servername | select Comment | ConvertTo-Html | Format-Table"');          
?>

и пытаюсь поместить их в выпадающее меню:

<select id="comment">
  <option value="comment"><?php echo $Comment; ?></option>
</select>`

Но я не могу найти способ разделить вывод с одним значением в каждом блоке.

вывод / данные из вызова оболочки выглядит так:

Comment                                                         
-------                                                         
2483                                                                                                                 
2066                                                                                                                                               1737

1 Ответ

3 голосов
/ 14 февраля 2020

Если вы хотите создать выпадающее меню выбора, вам нужно создать несколько записей, например:

<label for="printer">Choose a printer:</label>

<select id="printer" name="printer">
  <option value="printer-1">Printer 1</option>
  <option value="printer-2">Printer 2</option>
  <option value="printer-x">The last printer</option>
</select>

Но в любом случае я бы не стал PHP вызывать некоторые команды Powershell на каждой странице. нагрузить. Это очень очень медленно, и ваша страница вообще не будет реагировать.

Если вам нужно обновить этот список, подумайте о том, чтобы время от времени иметь файл конфигурации, записанный с помощью задачи cron (запланированная задача). время. Тогда ваш код PHP на странице должен просто загрузить массив принтеров, требуя этот файл конфигурации.

Например, вы можете создать список принтеров, сохранив его в формате JSON, который легко можно читать PHP.

Команда будет выглядеть так:

powershell.exe -Command "Get-Printer -ComputerName yourprintserver | select Name,DriverName,PortName,Comment | ConvertTo-Json"

Пример вывода:

[
    {
        "Name":  "PDF-cadwork",
        "DriverName":  "PDF-XChange 4.0 Lite",
        "PortName":  "PDF-XChange4",
        "Comment":  ""
    },
    {
        "Name":  "OKI C9800(PS)",
        "DriverName":  "OKI C9600(PS)",
        "PortName":  "IP_192.168.11.99",
        "Comment":  ""
    },
    {
        "Name":  "OKI C9800(PCL)",
        "DriverName":  "OKI C9800(PCL)",
        "PortName":  "IP_192.168.11.99",
        "Comment":  ""
    },
    {
        "Name":  "Microsoft XPS Document Writer",
        "DriverName":  "Microsoft XPS Document Writer v4",
        "PortName":  "PORTPROMPT:",
        "Comment":  ""
    },
    {
        "Name":  "HP LaserJet M570 PS",
        "DriverName":  "HP Universal Printing PS",
        "PortName":  "IP_192.168.11.96",
        "Comment":  ""
    },
    {
        "Name":  "HP Color LaserJet CM6030 MFP PCL6",
        "DriverName":  "HP Color LaserJet CM6030 MFP PCL6",
        "PortName":  "192.168.11.95",
        "Comment":  ""
    },
    {
        "Name":  "Canon iPF510",
        "DriverName":  "Canon iPF510",
        "PortName":  "IP_192.168.11.97",
        "Comment":  ""
    }
]

Как видите, У меня фактически нет ' Поле Комментарий заполнено , но это будет ваш случай.

Допустим, этот файл затем сохраняется в printers.json запланированным заданием. Для этого просто перенаправьте результат в ваш файл с помощью оператора >:

powershell.exe -Command "Get-Printer -ComputerName yourprintserver | select Name,DriverName,PortName,Comment | ConvertTo-Json" > C:\path-to-php-site\config\printers.json

Затем мы можем загрузить его в PHP:

<?php
// Get the list of printers from the automatically updated JSON file.
// Caution: PowerShell creates the file in "UCS-2 LE BOM" format.
//          PHP wants to read UTF-8 so we'll have to convert it.

// Read the JSON created by the scheduled task running PowerShell.
$printers_json_ucs2_le_bom = file_get_contents('printers.json');

// Convert to UTF-8 encoding.
$printers_json_utf8_bom = mb_convert_encoding(
    $printers_json_ucs2_le_bom, // Source content.
    'UTF-8',                    // Destination encoding.
    'UCS-2LE'                   // Source encoding.
);

// Remove the BOM marker which is still there.
$printers_json_utf8 = preg_replace('/\x{FEFF}/u', '', $printers_json_utf8_bom);

// Decode the JSON to a PHP variable.
$printers = json_decode($printers_json_utf8);

/**
 * Get the HTML code to create a select drop down to choose a printer.
 *
 * @param array $printers The list of printers.
 * @param string $name The name of the field in the form.
 * @param string $id THe id of the fiedl in the form.
 * @param string $lable The label to display before the select drop down.
 *
 * @return string The HTML code to put in your form.
 */
function get_printers_select(array $printers, $name = 'printer', $id = 'printer', $label = 'Select your printer')
{
    $html = '';
    if (!empty($label)) {
        $html .= '<label for="' . $id . '">' . htmlspecialchars($label) . "</label>\n";
    }
    $html .= '<select id="' . $id . '" name="' . $name . "\">\n";
    foreach ($printers as $printer) {
        $html .= '  <option value="' . htmlentities($printer->Comment) . '">' .
                 htmlspecialchars($printer->Comment) . "</option>\n";
    }
    $html .= "</select>\n";
    return $html;
}

// Your HTML and <form> should come here...

print get_printers_select($printers);

И это выведет это HTML, если я заменю $printer->Comment на $printer->Name:

<label for="printer">Select your printer</label>
<select id="printer" name="printer">
  <option value="PDF-cadwork">PDF-cadwork</option>
  <option value="OKI C9800(PS)">OKI C9800(PS)</option>
  <option value="OKI C9800(PCL)">OKI C9800(PCL)</option>
  <option value="Microsoft XPS Document Writer">Microsoft XPS Document Writer</option>
  <option value="HP LaserJet M570 PS">HP LaserJet M570 PS</option>
  <option value="HP Color LaserJet CM6030 MFP PCL6">HP Color LaserJet CM6030 MFP PCL6</option>
  <option value="Canon iPF510">Canon iPF510</option>
</select>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...