about_WQL

Se aplica a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0

TEMA

about_WQL

DESCRIPCIÓN BREVE

Describe el lenguaje de consulta de WMI (WQL), que puede usarse para obtener objetos WMI en Windows PowerShell®.

DESCRIPCIÓN LARGA

WQL es el lenguaje de consulta de Instrumental de administración de Windows (WMI), que es el lenguaje que se usa para obtener información de WMI.

No es necesario usar WQL para realizar una consulta de WMI en Windows PowerShell. En su lugar, puede usar los parámetros de los cmdlets Get-WmiObject o Get-CimInstance. Las consultas de WQL son un poco más rápidas que los comandos Get-WmiObject estándar y la mejora de rendimiento es evidente cuando los comandos se ejecutan en cientos de sistemas. Sin embargo, asegúrese de que el tiempo que emplea en escribir una consulta WQL correcta no supera la mejora del rendimiento.

Las instrucciones de WQL básicas que necesita para usar WQL son Select, Where y From.

CUÁNDO USAR WQL

Al trabajar con WMI, y especialmente con WQL, no olvide que también usa Windows PowerShell. A menudo, si una consulta WQL no funciona según lo esperado, es más fácil usar un comando estándar de Windows PowerShell que depurar la consulta WQL.

A menos que se vaya a devolver grandes cantidades de datos de sistemas remotos con limitaciones de ancho de banda, no suele resultar productivo pasar horas tratando de perfeccionar una consulta WQL complicada e intrincada cuando hay un cmdlet de Windows perfectamente aceptable que hace lo mismo, si bien un poco más lentamente.

USAR LA INSTRUCCIÓN SELECT

Una consulta de WMI típica comienza con una instrucción Select que obtiene todas las propiedades o ciertas propiedades en particular de una clase WMI. Para seleccionar todas las propiedades de una clase WMI, use un asterisco (*). La palabra clave From especifica la clase WMI.

Una instrucción Select tiene el formato siguiente:

        Select <property> from <WMI-class>

Por ejemplo, la siguiente instrucción Select selecciona todas las propiedades (*) de las instancias de la clase Win32_Bios de WMI.

        Select * from Win32_Bios

Para seleccionar una propiedad determinada de una clase WMI, coloque el nombre de propiedad entre las palabras clave Select y From.

La consulta siguiente solo selecciona el nombre de BIOS de la clase Win32_Bios de WMI. El comando guarda la consulta en la variable $queryName

        Select Name from Win32_Bios

Para seleccionar más de una propiedad, separe los nombres de propiedad con comas. La siguiente consulta de WMI selecciona el nombre y la versión de la clase Win32_Bios de WMI. El comando guarda la consulta en la variable $queryNameVersion.

        Select name, version from Win32_Bios

USAR LA CONSULTA WQL

Hay dos formas de usar la consulta WQL en el comando de Windows PowerShell.

Usar el cmdlet Get-WmiObject

Usar el cmdlet Get-CimInstance

Usar el acelerador de tipo [wmisearcher]

USAR EL CMDLET GET-WMIOBJECT

La manera más sencilla de usar la consulta WQL es encerrarla entre comillas (como una cadena) y, a continuación, usar la cadena de consulta como valor del parámetro Query del cmdlet Get-WmiObject, tal como se muestra en el ejemplo siguiente.

        PS C:\> Get-WmiObject -Query "Select * from Win32_Bios"
        SMBIOSBIOSVersion : 8BET56WW (1.36 )
        Manufacturer      : LENOVO
        Name              : Default System BIOS
        SerialNumber      : R9FPY3P
        Version           : LENOVO – 1360

También puede guardar la instrucción WQL en una variable y usar dicha variable como valor del parámetro Query, como se muestra en el comando siguiente.

        PS C:\> $query = "Select * from Win32_Bios"
        PS C:\> Get-WmiObject –Query $query

Puede usar los dos formatos con cualquier instrucción WQL. El comando siguiente usa la consulta en la variable $queryName para obtener solo las propiedades de nombre y versión del BIOS del sistema.

        PS C:\> $queryNameVersion = "Select Name, Version from Win32_Bios"
        PS C:\> Get-WmiObject -Query $queryNameVersion
        
        __GENUS          : 2
        __CLASS          : Win32_BIOS
        __SUPERCLASS     :
        __DYNASTY        :
        __RELPATH        :
        __PROPERTY_COUNT : 1
        __DERIVATION     : {}
        __SERVER         :
        __NAMESPACE      :
        __PATH           :
        Name             : Default System BIOS
        Version          : LENOVO - 1360

Recuerde que puede usar los parámetros del cmdlet Get-WmiObject para obtener el mismo resultado. Por ejemplo, el comando siguiente también obtiene los valores de las propiedades Name y Version de instancias de la clase Win32_Bios de WMI.

        PS C:\> Get-WmiObject –Class Win32_Bios -Property Name, Version
        __GENUS          : 2
        __CLASS          : Win32_BIOS
        __SUPERCLASS     :
        __DYNASTY        :
        __RELPATH        :
        __PROPERTY_COUNT : 1
        __DERIVATION     : {}
        __SERVER         :
        __NAMESPACE      :
        __PATH           :
        Name             : Default System BIOS
        Version          : LENOVO - 1360

USAR EL CMDLET GET-CIMINSTANCE

A partir de Windows PowerShell 3.0, puede usar el cmdlet Get-CimInstance para ejecutar consultas WQL.

Get-CimInstance obtiene instancias de clases compatibles con CIM, incluidas las clases WMI. Los cmdlets de CIM, que se introdujeron en Windows PowerShell 3.0, realizan las mismas tareas que los cmdlets de WMI. Los cmdlets de CIM cumplen los estándares de WS-Management (WSMan) y el estándar del Modelo de información común (CIM), que permite a los cmdlets usar las mismas técnicas para administrar equipos con Windows y equipos con otros sistemas operativos.

El comando siguiente usa el cmdlet Get-CimInstance para ejecutar una consulta WQL.

Todas las consultas WQL que pueden usarse con Get-WmiObject también pueden usarse con Get-CimInstance.

        PS C:\> Get-CimInstance -Query "Select * from Win32_Bios"
        SMBIOSBIOSVersion : 8BET56WW (1.36 )
        Manufacturer      : LENOVO
        Name              : Default System BIOS
        SerialNumber      : R9FPY3P
        Version           : LENOVO – 1360

Get-CimInstance devuelve un objeto CimInstance, en lugar del ManagementObject que Get-WmiObject devuelve, pero los objetos son bastante parecidos.

        PS C:\>(Get-CimInstance -Query "Select * from Win32_Bios").GetType().FullName
        Microsoft.Management.Infrastructure.CimInstance
        PS C:\>(Get-WmiObject -Query "Select * from Win32_Bios").GetType().FullName
        System.Management.ManagementObject

USAR EL ACELERADOR DE TIPO [wmisearcher]

El acelerador de tipo [wmisearcher] crea un objeto ManagementObjectSearcher a partir de una cadena de instrucción WQL. El objeto ManagementObjectSearcher tiene muchas propiedades y métodos, pero el método más básico es el método Get, que invoca la consulta WMI especificada y devuelve los objetos resultantes.

Mediante el uso de [wmisearcher], se puede acceder fácilmente a la clase ManagementObjectSearcher de .NET Framework. Esto permite consultar WMI y configurar el modo en que la consulta se lleva a cabo.

Para usar el acelerador de tipo [wmisearcher]:

1. Convierta la cadena WQL en un objeto ManagementObjectSearcher.

2. Llame al método Get del objeto ManagementObjectSearcher.

Por ejemplo, el comando siguiente convierte la consulta "seleccionar todo", guarda el resultado en la variable $bios y llama al método de Get del objeto ManagementObjectSearcher en la variable $bios.

        PS C:\> $bios = [wmisearcher]"Select * from Win32_Bios"
        PS C:\> $bios.Get()
        
        SMBIOSBIOSVersion : 8BET56WW (1.36 )
        Manufacturer      : LENOVO
        Name              : Default System BIOS
        SerialNumber      : R9FPY3P
        Version           : LENOVO – 1360

NOTA:

solo las propiedades del objeto seleccionado se muestran de forma predeterminada. Estas propiedades se definen en el archivo Types.ps1xml.

Puede usar el acelerador de tipo [wmisearcher] para convertir la consulta o la variable. En el ejemplo siguiente, el acelerador de tipo [wmisearcher] se usa para convertir la variable. El resultado es el mismo.

        PS C:\> [wmisearcher]$bios = "Select * from Win32_Bios"
        PS C:\> $bios.Get()
        
        SMBIOSBIOSVersion : 8BET56WW (1.36 )
        Manufacturer      : LENOVO
        Name              : Default System BIOS
        SerialNumber      : R9FPY3P
        Version           : LENOVO – 1360

Cuando se usa el acelerador de tipo [wmisearcher], convierte la cadena de consulta en un objeto ManagementObjectSearcher, como se muestra en los comandos siguientes.

        PS C:\>$a = "Select * from Win32_Bios"
        PS C:\>$a.GetType().FullName
        System.String
        PS C:\>$a = [wmisearcher]"Select * from Win32_Bios"
        PS C:\>$a.GetType().FullName
        System.Management.ManagementObjectSearcher

Este formato de comando funciona en cualquier consulta. El comando siguiente obtiene el valor de la propiedad Name de la clase Win32_Bios de WMI.

        PS C:\> $biosname = [wmisearcher]"Select Name from Win32_Bios"
        PS C:\> $biosname.Get()
        
        __GENUS          : 2
        __CLASS          : Win32_BIOS
        __SUPERCLASS     :
        __DYNASTY        :
        __RELPATH        :
        __PROPERTY_COUNT : 1
        __DERIVATION     : {}
        __SERVER         :
        __NAMESPACE      :
        __PATH           :
        Name             : Default System BIOS

Puede realizar esta operación en un solo comando, aunque el comando es un poco más difícil de interpretar.

En este formato, use el acelerador de tipo [wmisearcher] para convertir la cadena de consulta WQL en un ManagementObjectSearcher y, a continuación, llame al método Get en el objeto, todo ello en un solo comando. Los paréntesis () que rodean la cadena convertida le indican a Windows PowerShell que convierta la cadena antes de llamar al método.

        PS C:\> ([wmisearcher]"Select name from Win32_Bios").Get()
        __GENUS          : 2
        __CLASS          : Win32_BIOS
        __SUPERCLASS     :
        __DYNASTY        :
        __RELPATH        :
        __PROPERTY_COUNT : 1
        __DERIVATION     : {}
        __SERVER         :
        __NAMESPACE      :
        __PATH           :
        Name             : Default System BIOS

USAR LA INSTRUCCIÓN WHERE BÁSICA DE WQL

Una instrucción Where establece las condiciones de los datos que devuelve una instrucción Select.

La instrucción Where tiene el formato siguiente:

        where <property> <operator> <value>

Por ejemplo:

        where Name = 'Notepad.exe'

La instrucción Where se usa con la instrucción Select, como se muestra en el ejemplo siguiente.

        Select * from Win32_Process where Name = 'Notepad.exe'

Cuando se usa la instrucción Where, el nombre y el valor de la propiedad deben ser precisos.

Por ejemplo, el comando siguiente obtiene los procesos del Bloc de notas del equipo local.

        PS C:\> Get-WmiObject -Query "Select * from Win32_Process where name = 'Notepad.exe'"

Sin embargo, el comando siguiente genera un error, ya que el nombre de proceso incluye la extensión de nombre de archivo ".exe".

        PS C:\> Get-WmiObject -Query "Select * from Win32_Process where name = 'Notepad'"

OPERADORES DE COMPARACIÓN DE LA INSTRUCCIÓN WHERE

Los operadores siguientes son válidos en una instrucción Where de WQL.

    Operator    Description
    -----------------------
    =           Equal
    !=          Not equal
    <>          Not equal
    <           Less than
    >           Greater than
    <=          Less than or equal
    >=          Greater than or equal
    LIKE        Wildcard match
    IS          Evaluates null 
    ISNOT       Evaluates not null
    ISA         Evaluates a member of a WMI class

Hay otros operadores, pero estos son los que se usan para realizar comparaciones.

Por ejemplo, la consulta siguiente selecciona las propiedades Name y Priority de los procesos de la clase Win32_Process, donde la prioridad del proceso es mayor o igual a 11. El cmdlet Get-WmiObject ejecuta la consulta.

        $highPriority = "Select Name, Priority from Win32_Process where Priority >= 11"
        Get-WmiObject -Query $highPriority

USAR LOS OPERADORES DE WQL EN EL PARÁMETRO FILTER

Los operadores de WQL también pueden usarse en el valor del parámetro Filter de los cmdlets Get-WmiObject o Get-CimInstance, así como en el valor de los parámetros Query de estos cmdlets.

Por ejemplo, el comando siguiente obtiene las propiedades Name y ProcessID de los últimos cinco procesos que tienen valores ProcessID mayores que 1004. El comando usa el parámetro Filter para especificar la condición ProcessID.

        PS C:\> Get-WmiObject -Class Win32_Process `
        -Property Name, ProcessID -Filter "ProcessID >= 1004" | 
        Sort ProcessID | Select Name, ProcessID -Last 5
        
        Name                                 ProcessID
        ----                                 ---------
        SROSVC.exe                                4220
        WINWORD.EXE                               4664
        TscHelp.exe                               4744
        SnagIt32.exe                              4748
        WmiPrvSE.exe                              5056

USAR EL OPERADOR LIKE

El operador Like permite usar caracteres comodín para filtrar los resultados de una consulta WQL.

Operador Like Descripción

[]

Carácter en un intervalo [a-f] o juego de caracteres [abcdef]. No es necesario que los elementos de un juego sean consecutivos o se enumeren en orden alfabético.

^

Carácter no incluido en un intervalo [^a-f] o en un juego [^abcdef]. No es necesario que los elementos de un juego sean consecutivos o se enumeren en orden alfabético.

%

Cadena de cero o más caracteres.

_

Un carácter.

(carácter de subrayado)

NOTA:

para usar un carácter de subrayado literal en una cadena de consulta, inclúyalo entre corchetes [_].

Cuando se usa el operador Like sin caracteres comodín ni operadores de intervalo, se comporta como el operador de igualdad (=) y devuelve objetos solo cuando coinciden exactamente con el patrón.

Puede combinar la operación de intervalo con el carácter comodín de porcentaje para crear filtros simples, pero muy eficaces.

EJEMPLOS DEL OPERADOR LIKE

EJEMPLO 1: [<range>]

Los comandos siguientes inician el Bloc de notas y buscan una instancia de la clase Win32_Process con un nombre que comience con una letra entre "H" y "N" (no distingue mayúsculas de minúsculas).

La consulta debe devolver cualquier proceso de Hotpad.exe a través de Notepad.exe.

        PS C:\> Notepad   # Starts Notepad
        PS C:\> $query = "Select * from win32_Process where Name LIKE '[H-N]otepad.exe'"
        PS C:\> Get-WmiObject -Query $query | Select Name, ProcessID
        
        Name                                ProcessID
        ----                                ---------
        notepad.exe                              1740

EJEMPLO 2: [<range>] y %

Los comandos siguientes seleccionan todos los procesos con un nombre que comience con una letra entre A y P (no distingue mayúsculas de minúsculas) seguido de cero o más letras en cualquier combinación.

El cmdlet Get-WmiObject ejecuta la consulta, el cmdlet Select-Object obtiene las propiedades Name y ProcessID y el cmdlet Sort-Object ordena los resultados en orden alfabético por nombre.

        PS C:\>$query = "Select * from win32_Process where name LIKE '[A-P]%'"
        PS C:\>Get-WmiObject -Query $query | 
                  Select-Object -Property Name, ProcessID | 
                  Sort-Object -Property Name

EJEMPLO 3: No está en el intervalo (^)

El comando siguiente obtiene los procesos cuyo nombre no comience por una de estas letras: A, S, W, P, R, C, U, N, seguido por cero o más letras.

        PS C:\>$query = "Select * from win32_Process where name LIKE '[^ASWPRCUN]%'"
        PS C:\>Get-WmiObject -Query $query | 
                  Select-Object -Property Name, ProcessID | 
                  Sort-Object -Property Name

EJEMPLO 4: Algún carácter o ninguno (%)

Los comandos siguientes obtienen los procesos con nombres que comiencen con "calc". El símbolo % en WQL es equivalente al símbolo de asterisco (*) en las expresiones regulares.

        PS C:\> $query = "Select * from win32_Process where Name LIKE 'calc%'"
        PS C:\> Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
        
        Name                               ProcessID
        ----                               ---------
        calc.exe                                4424

EJEMPLO 5: Un carácter (_)

Los comandos siguientes obtienen los procesos con nombres que siguen el patrón "c_lc.exe", donde el carácter de subrayado representa un carácter cualquiera. Este patrón coincide con cualquier nombre desde calc.exe hasta czlc.exe o c9lc.exe, pero no coincide con los nombres en los que "c" y "l" están separados por más de un carácter.

      PS C:\> $query = "Select * from Win32_Process where Name LIKE 'c_lc.exe'"
      PS C:\> Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
        
        Name                                 ProcessID
        ----                                 ---------
        calc.exe                                  4424

EJEMPLO 6: Coincidencia exacta

Los comandos siguientes obtienen procesos denominados WLIDSVC.exe. Aunque la consulta usa la palabra clave Like, requiere una coincidencia exacta, ya que el valor no incluye caracteres comodín.

        $query = "Select * from win32_Process where name LIKE 'WLIDSVC.exe'"
        Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
        Name                                 ProcessID
        ----                                 ---------
        WLIDSVC.exe                                84

USAR EL OPERADOR OR

Para especificar varias condiciones independientes, use la palabra clave Or. La palabra clave Or aparece en la cláusula Where. Realiza una operación OR inclusiva en dos (o más) condiciones y devuelve los elementos que cumplen las condiciones.

El operador Or tiene el formato siguiente:

        Where <property> <operator> <value> or <property> <operator> <value> ...

Por ejemplo, los comandos siguientes obtienen todas las instancias de la clase Win32_Process de WMI, pero solo las devuelven si el nombre del proceso es winword.exe o excel.exe.

        PS C:\>$q = "Select * from Win32_Process where Name = 'winword.exe' or Name = 'excel.exe'"
        PS C:\>Get-WmiObject -Query $q

Puede usarse la instrucción Or con más de dos condiciones. En la consulta siguiente, la instrucción Or obtiene Winword.exe, Excel.exe o Powershell.exe.

        $q = "Select * from Win32_Process where Name = 'winword.exe' or Name = 'excel.exe' or Name = 'powershell.exe'"

USAR EL OPERADOR AND

Para especificar varias condiciones relacionadas, use la palabra clave And. La palabra clave And aparece en la cláusula Where. Devuelve los elementos que cumplen todas las condiciones.

El operador And tiene el formato siguiente:

        Where <property> <operator> <value> and <property> <operator> <value> ...

Por ejemplo, los comandos siguientes obtienen los procesos que tienen el nombre "Winword.exe" y el identificador de proceso 6512.

Tenga en cuenta que los comandos usan el cmdlet Get-CimInstance.

        PS C:\>$q = "Select * from Win32_Process where Name = 'winword.exe' and ProcessID =6512"
        PS C:\> Get-CimInstance -Query $q
        ProcessId        Name             HandleCount      WorkingSetSize   VirtualSize
        ---------        ----             -----------      --------------   -----------
        6512             WINWORD.EXE      768              117170176        633028608

Todos los operadores, incluidos los operadores Like, son válidos con los operadores Or y And. Además, puede combinar los operadores Or y And en una sola consulta entre paréntesis que le indique a Windows PowerShell qué cláusulas debe procesar primero.

Este comando usa el carácter de continuación (`) de Windows PowerShell para dividir el comando en dos líneas.

        PS C:\> $q = "Select * from Win32_Process `
        where (Name = 'winword.exe' or Name = 'excel.exe') and HandleCount > 700"
        PS C:\> Get-CimInstance -Query $q
        ProcessId        Name             HandleCount      WorkingSetSize   VirtualSize
        ---------        ----             -----------      --------------   -----------
        6512             WINWORD.EXE      797              117268480        634425344
        9610             EXCEL.EXE        727               38858752        323227648

BUSCAR VALORES NULL

Es difícil buscar valores null en WMI, ya que puede generar resultados impredecibles. Null no es cero y no es equivalente a una cadena vacía. Algunas propiedades de la clase WMI están inicializadas y otras no, por lo que una búsqueda de null podría no funcionar para todas las propiedades.

Para buscar valores null, use el operador Is con un valor "null".

Por ejemplo, los comandos siguientes obtienen los procesos que tienen un valor null para la propiedad IntallDate. Los comandos devuelven varios procesos.

PS C:\>$q = "Select * from Win32_Process where InstallDate is null"
        PS C:\>Get-WmiObject -Query $q

En cambio, el comando siguiente obtiene las cuentas de usuario que tienen un valor null para la propiedad Description. Este comando no devuelve ninguna cuenta de usuario, aunque la mayoría de las cuentas de usuario no tienen ningún valor para la propiedad Description.

        PS C:\>$q = "Select * from Win32_UserAccount where Description is null"
        PS C:\>Get-WmiObject -Query $q

Para encontrar las cuentas de usuario que no tienen ningún valor para la propiedad Description, use el operador de igualdad para obtener una cadena vacía. Para representar una cadena vacía, use dos comillas simples consecutivas.

        $q = "Select * from Win32_UserAccount where Description = '' "

USAR TRUE O FALSE

Para obtener valores booleanos en las propiedades de objetos WMI, use True y False. No distinguen mayúsculas de minúsculas.

La siguiente consulta WQL solo devuelve las cuentas de usuario local de un equipo unido a un dominio.

        PS C:\>$q = "Select * from Win32_UserAccount where LocalAccount = True"
        PS C:\>Get-CimInstance -Query $q

Para buscar las cuentas de dominio, use un valor False, tal como se muestra en el ejemplo siguiente.

        PS C:\>$q = "Select * from Win32_UserAccount where LocalAccount = False"
        PS C:\>Get-CimInstance -Query $q

USAR EL CARÁCTER DE ESCAPE

WQL usa la barra diagonal inversa (\) como carácter de escape. Esto difiere de Windows PowerShell, que usa el carácter de acento grave (`).

Las comillas y los caracteres usados como comillas a menudo necesitan incluir caracteres de escape para que no se interpreten erróneamente.

Para buscar un usuario cuyo nombre incluya una comilla simple, use una barra diagonal inversa como carácter de escape de la comilla simple, como se muestra en el comando siguiente.

        PS C:\> $q = "Select * from Win32_UserAccount where Name = 'Tim O\'Brian'"
        PS C:\> Get-CimInstance -Query $q
        Name             Caption          AccountType      SID              Domain
        ----             -------          -----------      ---              ------
        Tim O'Brian      FABRIKAM\TimO    512              S-1-5-21-1457... FABRIKAM

En algunos casos, también es necesario usar un carácter de escape con la barra diagonal inversa. Por ejemplo, los comandos siguientes generan un error de consulta no válida debido a la barra diagonal inversa en el valor Caption.

        PS C:\> $q = "Select * from Win32_UserAccount where Caption = 'Fabrikam\TimO'"
        PS C:\> Get-CimInstance -Query $q
        Get-CimInstance : Invalid query
        At line:1 char:1
        + Get-CimInstance -Query $q
        + ~~~~~~~~~~~~~~~~~~~~~~~~~
            + CategoryInfo          : InvalidArgument: (:) [Get-CimInstance], CimException
            + FullyQualifiedErrorId : HRESULT 0x80041017,Microsoft.Management.Infrastructure.CimCmdlets

Para incluir un carácter de escape con la barra diagonal inversa, use un segundo carácter de barra diagonal inversa, como se muestra en el comando siguiente.

        PS C:\> $q = "Select * from Win32_UserAccount where Caption = 'Fabrikam\\TimO'"
        PS C:\> Get-CimInstance -Query $q

VEA TAMBIÉN

about_Escape_Characters

about_Quoting_Rules

about_WMI

about_WMI_Cmdlets