powershell logfile get-wmiobject select-object

powershell - ¿Cómo escribo el valor de una sola propiedad de un objeto?



logfile get-wmiobject (2)

Así es como se ve mi script actual:

$cpu = Get-WmiObject win32_processor | select LoadPercentage logwrite $cpu

La salida del archivo es:

@{LoadPercentage=4}

Quiero que sea solo el número para poder hacer cálculos.


Esa es una solución bastante simple. En lugar de seleccionar LoadPercentage al ejecutar Get-WmiObject, simplemente seleccione la propiedad al llamar a su función. Esto escribirá solo el número en su archivo de registro.

$cpulogpath = "C:/Monitoring/$date.csv" function logwrite { param ([string]$logstring) add-content $cpulogpath -value $logstring } $cpu = Get-WmiObject win32_processor #don''t select the property here logwrite $cpu.LoadPercentage #select it here


La útil respuesta de qbanet359 utiliza el acceso directo a la propiedad ( .LoadPercentage ) en el objeto de resultado, que es la solución más simple y eficiente en este caso.

En PowerShell v3 o superior, esto incluso funciona con la extracción de valores de propiedad de una colección de objetos , a través de una característica llamada enumeración de miembros .

En los casos en los que desee utilizar Select-Object (o su alias incorporado, select ), como cuando se procesa una gran colección de elementos de entrada por elemento :

Para usar Select-Object para extraer un solo valor de propiedad, debe usar -ExpandProperty :

Get-WmiObject win32_processor | Select-Object -ExpandProperty LoadPercentage

Antecedentes :

Select-Object por defecto crea objetos personalizados (instancias [pscustomobject] [1] ) que tienen las propiedades que especifique a través del parámetro -Property (opcionalmente implícitamente, como el 1er argumento).

Esto se aplica incluso cuando se especifica una sola propiedad, de modo que select LoadPercentage (abreviatura de: Select-Object -Property LoadPercentage ) crea algo como el siguiente objeto:

$obj = [pscustomobject] @{ LoadPercentage = 4 } # $obj.LoadPercentage yields 4

Debido a que usa Add-Content para escribir en su archivo de registro, se .ToString() representación de cadena .ToString() de ese objeto personalizado, como se obtendría si usara el objeto en una cadena expandible (intente "$([pscustomobject] @{ LoadPercentage = 4 })" ).

Por el contrario, el parámetro -ExpandProperty , que se puede aplicar a una sola propiedad, no crea un objeto personalizado y en su lugar devuelve el valor de esa propiedad del objeto de entrada.

[1] Estrictamente hablando, son instancias [System.Management.Automation.PSCustomObject] , mientras que type accelerator [pscustomobject] , confusamente, se refiere al tipo [System.Management.Automation.PSObject] , por razones históricas; vea este problema de GitHub .