我在Windows Server上运行PHP,并且我有一个使用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类中提取每个属性名称。由于每个名为property的属性后跟“:”,我能够通过搜索每个展开的字符串来查找此模式并将值返回到左侧来解决此问题。如果该模式不存在,则可能是因为超过80个字符限制而被破坏的行。
$PatternPosition = strpos($WMIPropertyResult, " : ");
$WMIPropertyName = substr($WMIPropertyResult, 0, $PatternPosition);
PowerShell格式化输出以对齐所有属性值,但它根据最长的属性名称对其进行格式化,属性名称显然会根据查询的WMI类进行更改。因此,搜索“:”模式而不是在substr()函数中对值进行硬编码更有意义。
如果有人对原始问题有任何建议,我会留下这篇文章,但对于我的用例,我相信我有足够的解决方法。