Я использую PHP на Windows Server, и у меня есть скрипт, который использует PowerShell для выполнения некоторых запросов WMI. Я беру результаты запроса и разбиваю его на разрыв строки, чтобы каждое свойство класса WMI было отдельной строкой (и позже будет использоваться для других вещей).
Проблема у меня заключается в том, что по умолчанию ширина окна командной строки ограничена 80 символами, поэтому, когда PHP-скрипт получает результаты запроса WMI, некоторые строки, превышающие 80 символов, разбиваются на многочисленные строки, и я очень нравится, чтобы каждая строка была только одной строкой, независимо от длины строки.
Я попытался войти на сервер и изменить ширину командной строки по умолчанию, а также 32- и 64-разрядные окна PowerShell. Когда я запускаю команды непосредственно в этих приложениях, я вижу, что они больше не разбиваются на 80 символов. Тем не менее, мой PHP-скрипт все еще делает.
Вот фрагмент моего кода:
exec("powershell.exe -Command \" & { Get-WmiObject -Query 'Select * From Win32OperatingSystem' | Format-List *} \" ", $Output, $ReturnValue);
foreach ($Output as $PSOutput) {
$ExplodePSOutput = explode("\r\n", $PSOutput);
foreach ($ExplodePSOutput as $WMIProperty) {
echo $WMIProperty."<br>";
}
}
Вот пример того, на что похож вывод:
Status : OK
Name : Microsoft Windows 10 Enterprise|C:\
WINDOWS|\Device\Harddisk0\Partition
2
FreePhysicalMemory : 9224968
Но я хочу, чтобы это выглядело так:
Status : OK
Name : Microsoft Windows 10 Enterprise|C:\WINDOWS|\Device\Harddisk0\Partition2
FreePhysicalMemory : 9224968
Обновить:
Моя конечная цель состояла в том, чтобы извлечь каждое имя свойства из выбранного класса WMI. Поскольку за каждым именем свойства следовал знак «:», я смог обойти эту проблему, выполнив поиск в каждой разобранной строке для этого шаблона и вернув значение слева от него. Если этот шаблон не существует, возможно, это строка, которая была разорвана из-за превышения предела в 80 символов.
$PatternPosition = strpos($WMIPropertyResult, " : ");
$WMIPropertyName = substr($WMIPropertyResult, 0, $PatternPosition);
PowerShell форматирует выходные данные, чтобы выровнять все значения свойств, но форматирует его на основе самого длинного имени свойства, а имена свойств, очевидно, будут меняться в зависимости от того, какой класс WMI запрашивается. Поэтому имеет смысл искать шаблон «:» вместо жесткого кодирования значения в функции substr ().
Я оставлю этот пост на всякий случай, если у кого-то есть предложение по первоначальному вопросу, но для моего случая использования, я считаю, у меня есть достаточный обходной путь.
Задача ещё не решена.
Других решений пока нет …