exec () - Ergebnisstring sinnvoll auswerten

Fragenfrager

Erfahrenes Mitglied
Hallo liebes Forum,

um diverse Server auf noch vorhandenen Festplattenplatz zu überpüfen, verwende ich das Tool psinfo.
Ich rufe es über PHP mittels des exec-Befehls auf und steuere die verschiedenen Server an:
PHP:
<?php
$res = exec("psinfo \\\\192.1.1.1 -d -c");
echo $res;
?>
Der Parameter -d gibt den Plattenplatz der Laufwerke zurück, -c liefert das Ergebnis als csv.
Es sähe dann ungefähr so aus:
Code:
192.1.1.1,Error reading uptime,Microsoft Windows Server 2003, Uniprocessor Free,Standard Edition,5.2,2,3790,Firma XY,Test ,8.0000,C:\WINDOWS,1,1.9 GHz,Intel(R) Xeon(R) CPU E5405 @,3840 MB,VMware SVGA II,A:,Removable,,,,,0.0%,C:,Fixed,NTFS,,29.99 GB,14.43 GB,48.1%,Z:,CD-ROM,,,,,0.0%
Das Ergebnis kann je nach Server unterschiedlich vielen Laufwerke ergeben. Mich interessieren für die Abfrage nur die Festplatten, also der Teil
Code:
 C:,Fixed,NTFS,,29.99 GB,14.43 GB,48.1%
Erkennbar ist es am Begriff "Fixed";
Solange ich nur eine Festplatte habe, kann ich das ganz gut rausfiltern, wie aber gehe ich vor, wenn ich zB folgendes Ergebnis bekomme:
Code:
192.1.1.2,Error reading uptime,Microsoft Windows Server 2003, Multiprocessor Free,Standard Edition,5.2,2,3790,Firma XY,Test 2,8.0000,C:\WINDOWS,8,2.3 GHz,Intel(R) Xeon(R) CPU E5345 @,8192 MB,ATI ES1000 ,C:,Fixed,NTFS,SYSTEM,136.60 GB,75.95 GB,55.6%,D:,Fixed,NTFS,DATA,292.97 GB,113.18 GB,38.6%,E:,Fixed,NTFS,LOGS,265.60 GB,180.51 GB,68.0%,Z:,CD-ROM,,,,,0.0%
Das Laufwerk Z (Typ CD Rom) interessiert mich nicht.
Mir fehlt gerade komplett der Ansatz, diesen Ergebnisstring vernünftig aufzubereiten.

Als Ziel hätte ich gerne die Tabelle:
Volume | Type | Format | Label | Size | Free | Free %
C: |Fixed | NTFS | SYSTEM |136.60 GB | 75.95 GB | 55.6%
D: |Fixed | NTFS | DATA |292.97 GB | 113.18 GB | 38.6%
E: | Fixed| NTFS | LOGS |265.60 GB |180.51 GB | 68.0%

Vielen Dank für eure Vorschläge.
 
Hallo Fragenfrager

preg_match_all() heisst das Ding das du suchst. Mit einem Regulären Ausdruck sollte man das hinkriegen

Pattern:
Code:
/([[:alpha:]]:),(Fixed),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*)/


PHP:
<?PHP
  $subject = '192.1.1.2,Error reading uptime,Microsoft Windows Server 2003, Multiprocessor Free,Standard Edition,5.2,2,3790,Firma XY,Test 2,8.0000,C:\\WINDOWS,8,2.3 GHz,Intel(R) Xeon(R) CPU E5345 @,8192 MB,ATI ES1000 ,C:,Fixed,NTFS,SYSTEM,136.60 GB,75.95 GB,55.6%,D:,Fixed,NTFS,DATA,292.97 GB,113.18 GB,38.6%,E:,Fixed,NTFS,LOGS,265.60 GB,180.51 GB,68.0%,Z:,CD-ROM,,,,,0.0%';

  $pattern = '/([[:alpha:]]:),(Fixed),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*)/';
  if(preg_match_all($pattern, $subject, $results, PREG_SET_ORDER)){
     echo "<table>\n";
     foreach($results as $result){
         echo "\t<tr>\n";
         //Der komplex gefuindene String interessiert uns nicht
         array_shift($result);
         //Alle Felder Ausgaben
         foreach($result as $field){
             echo "\t\t<td>{$field}</td>\n";
         }
         echo "\t</tr>\n";
     } 
     echo "</table>\n";
  }
?>

ergibt
HTML:
<table>
	<tr>
		<td>C:</td>
		<td>Fixed</td>
		<td>NTFS</td>
		<td>SYSTEM</td>
		<td>136.60 GB</td>
		<td>75.95 GB</td>
		<td>55.6%</td>
	</tr>
	<tr>
		<td>D:</td>
		<td>Fixed</td>
		<td>NTFS</td>
		<td>DATA</td>
		<td>292.97 GB</td>
		<td>113.18 GB</td>
		<td>38.6%</td>
	</tr>
	<tr>
		<td>E:</td>
		<td>Fixed</td>
		<td>NTFS</td>
		<td>LOGS</td>
		<td>265.60 GB</td>
		<td>180.51 GB</td>
		<td>68.0%</td>

	</tr>
</table>
 
Sehr hübsch. Es funktioniert. Ich guck mir jetzt noch die Referenz dazu an, damit ich auch verstehe, was da passiert. Ein Met auf Dich!
 

Neue Beiträge

Zurück