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
.