none
PowerShell comportamiento Get-WmiObject RRS feed

  • Pregunta

  • Buenos dias a Todos:

    A ver quien me puede echar una mano con lo siguiente.

    Tengo metido en un script la siguiente secuencia de comandos:

    Get-ChildItem "c:\"|Select-Object Name, creationtime,@{Name="TamañoMB";Expression={[math]::truncate($_.length /1MB)}}
    Get-WmiObject -query "select Size, DeviceID, freespace from win32_logicaldisk where DeviceID='C:'"| Select-Object DeviceID, FreeSpace, Size

    Al lanzarlo, veo que el Get-WmiObject, no me devuelve nada, en cambio, si comento la linea Get-Childitem, la respuesta del comando es la correcta.

    Alguien me podría explicar a que se debe este comportamiento.

     

    Gracias y Saludos

    • Cambiado Marc Salvador martes, 15 de marzo de 2011 11:58 Pregunta de PowerShell (De:General)
    martes, 15 de marzo de 2011 10:31

Respuestas

  • Get-ChildItem "c:\"|Select-Object Name, creationtime,@{Name="TamañoMB";`
    	Expression={[math]::truncate($_.length /1MB)}} | Out-String
    Get-WmiObject -query "select Size, DeviceID, freespace from win32_logicaldisk where DeviceID='C:'"`
    	| Select-Object DeviceID, FreeSpace, Size 
    
    
    
    martes, 15 de marzo de 2011 18:49
  • Curioso que se arregle al convertir la salida a cadena. Eso no debería ser así, es una pena el perder los objetos, aunque en este caso no importe, pues no son utilizados a posteriori.

    He observado que cambiando el orden de las instrucciones sucede lo mismo, el Get-ChildItem no se muestra. También que si los resultados son almacenados en variables, éstas tienen los valores, pero al invocar una detrás de otra sucede lo mismo, no se muestra la segunda:

     

    $a = Get-ChildItem "c:\"|Select-Object Name, creationtime,@{Name="TamañoMB";`
              Expression={[math]::truncate($_.length /1MB)}}
    $b = Get-WmiObject win32_logicaldisk -filter "DeviceID='C:'"| Select-Object DeviceID,FreeSpace,Size
    $a
    $b

     

    Sin embargo, si posteriormente se pide el valor de $b, se muestra sin problemas, lo cual indica que se trata de un problema de presentación, no de que falle el comando. Una solución parecida a la que aportas es esta:

     

    Get-ChildItem "c:\"|Format-Table Name, creationtime,@{Name="TamañoMB";`
              Expression={[math]::truncate($_.length /1MB)}} -AutoSize
    Get-WmiObject win32_logicaldisk -filter "DeviceID='C:'"| Select-Object DeviceID,FreeSpace,Size

     

    Pero siguen perdiéndose los objetos, como ocurría con Out-String. El problema lo está dando Select-Object, pues esto otro no da problemas:

     

    Get-ChildItem "c:\"
    Get-WmiObject win32_logicaldisk -filter "DeviceID='C:'"

     

    Así que para evitarlo, se puede usar Format-Table en lugar de Select-Object, si no se necesita conservar los objetos:

     

    Get-ChildItem "c:\"|Format-Table Name, creationtime,@{Name="TamañoMB";`
              Expression={"{0:N2}" -f ($_.length /1MB)}} -AutoSize
    Get-WmiObject win32_logicaldisk -filter "DeviceID='C:'"| `
           Format-Table DeviceID,@{Name="LibreMB";`
              Expression={"{0:N2}" -f ($_.FreeSpace /1MB)}},@{Name="TamañoMB";`
              Expression={"{0:N2}" -f ($_.Size /1MB)}} -AutoSize
    Pero no es más que un atajo, no una solución, pues no se debería dar este problema, me da que es un bug.

     


    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    miércoles, 16 de marzo de 2011 8:24
    Moderador

Todas las respuestas

  • Muevo el hilo al grupo de PowerShell
    Saludos,

    Marc
    MCSA/MCSE 2003
    MCITP: Enterprise Administrator (Windows Server 2008)
    MCITP: Enterprise Messaging Administrator (Microsoft Exchange 2007 & Exchange 2010)
    Citrix CCA
    martes, 15 de marzo de 2011 11:58
  • Ups, perdón...
    martes, 15 de marzo de 2011 12:00
  • Pues a mí no me pasa eso. Copio y pego las dos líneas y PowerShell ejecuta ambas

    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    martes, 15 de marzo de 2011 15:14
    Moderador
  • Rectifico, sí me pasa. No me pasa si pego las líneas en una consola, pero sí pasa cuando las pego en un fichero de texto y lo guardo como script de PowerShell. Es raro, raro, raro. Lo estudiaré, a ver si encuentro explicación.
    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    martes, 15 de marzo de 2011 15:50
    Moderador
  • Gracias por contestar.

    Si, efectivamente lo comandos ejecutados directamente en la consola funcionan perfectamente.

     

     

     

    martes, 15 de marzo de 2011 17:19
  • Get-ChildItem "c:\"|Select-Object Name, creationtime,@{Name="TamañoMB";`
    	Expression={[math]::truncate($_.length /1MB)}} | Out-String
    Get-WmiObject -query "select Size, DeviceID, freespace from win32_logicaldisk where DeviceID='C:'"`
    	| Select-Object DeviceID, FreeSpace, Size 
    
    
    
    martes, 15 de marzo de 2011 18:49
  • Curioso que se arregle al convertir la salida a cadena. Eso no debería ser así, es una pena el perder los objetos, aunque en este caso no importe, pues no son utilizados a posteriori.

    He observado que cambiando el orden de las instrucciones sucede lo mismo, el Get-ChildItem no se muestra. También que si los resultados son almacenados en variables, éstas tienen los valores, pero al invocar una detrás de otra sucede lo mismo, no se muestra la segunda:

     

    $a = Get-ChildItem "c:\"|Select-Object Name, creationtime,@{Name="TamañoMB";`
              Expression={[math]::truncate($_.length /1MB)}}
    $b = Get-WmiObject win32_logicaldisk -filter "DeviceID='C:'"| Select-Object DeviceID,FreeSpace,Size
    $a
    $b

     

    Sin embargo, si posteriormente se pide el valor de $b, se muestra sin problemas, lo cual indica que se trata de un problema de presentación, no de que falle el comando. Una solución parecida a la que aportas es esta:

     

    Get-ChildItem "c:\"|Format-Table Name, creationtime,@{Name="TamañoMB";`
              Expression={[math]::truncate($_.length /1MB)}} -AutoSize
    Get-WmiObject win32_logicaldisk -filter "DeviceID='C:'"| Select-Object DeviceID,FreeSpace,Size

     

    Pero siguen perdiéndose los objetos, como ocurría con Out-String. El problema lo está dando Select-Object, pues esto otro no da problemas:

     

    Get-ChildItem "c:\"
    Get-WmiObject win32_logicaldisk -filter "DeviceID='C:'"

     

    Así que para evitarlo, se puede usar Format-Table en lugar de Select-Object, si no se necesita conservar los objetos:

     

    Get-ChildItem "c:\"|Format-Table Name, creationtime,@{Name="TamañoMB";`
              Expression={"{0:N2}" -f ($_.length /1MB)}} -AutoSize
    Get-WmiObject win32_logicaldisk -filter "DeviceID='C:'"| `
           Format-Table DeviceID,@{Name="LibreMB";`
              Expression={"{0:N2}" -f ($_.FreeSpace /1MB)}},@{Name="TamañoMB";`
              Expression={"{0:N2}" -f ($_.Size /1MB)}} -AutoSize
    Pero no es más que un atajo, no una solución, pues no se debería dar este problema, me da que es un bug.

     


    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)
    miércoles, 16 de marzo de 2011 8:24
    Moderador