Al ejecutar sistemas operativos Windows 10 o Windows Server 2016 contamos con una poderosa herramienta de gestión y control sobre múltiples parámetros del sistema y es Windows PowerShell.
Windows PowerShell ha sido actualizado en Windows 10 y Server 2016 para ofrecer un mejor control sobre cada proceso del sistema y el componente principal de PowerShell son los cmdlets.
Los cmdlets son el fundamento de Windows PowerShell, el cual es a su vez el último lenguaje de shell o scripting de comandos de Microsoft, por ello un cmdlet es un comando ligero que es usado en el entorno de Windows PowerShell.
Solvetic hará un completo análisis sobre los cmdlets que pueden ser implementados en Windows Powershell y, en lugar de centrarnos en los cmdlets individuales, este énfasis recae en las tareas que podremos llevar a cabo con esos cmdlets. Estas tareas incluyen diversos aspectos como leer y escribir archivos de texto hasta administrar registros de eventos y clasificar o filtrar datosy así veremos como nuestras tareas de soporte serán mucho más centralizadas.
Comprenderemos como el uso de cmdlets nos dará la oportunidad de obtener mucha más información de la que pensamos obtener.
1. Comandos cmdlets en PowerShell de fecha y hora
Dentro de este grupo se incluyen tareas como recuperar la fecha y hora actual, y realizar la aritmética de la fecha.
Los tiempos en el equipo a menudo se asignan usando un servicio horario automático; en ese caso, probablemente no sea necesario establecer fechas y horas de forma manual, pero si por alguna razón necesitamos configurar las fechas y horas manualmente, Set-Date proporciona una manera fácil de hacerlo.
Una forma de cambiar la fecha y/o hora en un equipo es usar el parámetro -date seguido de la nueva fecha y hora. Por ejemplo, para establecer la fecha y la hora a las 10:30 a.m. del 6 de noviembre de 2017 ejecutaremos la siguiente línea:
Set-Date -date "11/6/2017 10:30 AM"
De forma automática se establece la nueva hora y fecha en el sistema. En caso de ser necesario ajustar el reloj en dos días, este comando usa el cmdlet Get-Date y el método AddDays para adelantar el reloj dos días:
Set-Date (Get-Date).AddDays(2)Esto aumentará dos días a la fecha actual tomando la hora real del sistema:
Otros métodos que podemos usar incluyen AddHours, AddMinutes y AddSeconds, estas opciones nos permiten ajustar horas, minutos o segundos según condiciones del clima o algún tipo de gestión administrativa.
Por ejemplo, en países donde la hora se ve afectada por el verano podemos ajustar el reloj menos una hora usando la siguiente línea:
Set-Date (Get-Date).AddHours(-1)De forma alternativa, es posible usar el parámetro -adjust para ajustar la hora usando el formato horas: minutos: segundos. Por ejemplo, este comando establece el reloj por delante 2 hora y 40 minutos:
Set-Date -adjust 2:40:0
Si deseamos visualizar la fecha y hora actuales, simplemente usaremos el cmdlet Get-Date sin ningún parámetro adicional:
Get-Date
Allí tenemos el día, fecha y hora actuales. Si deseamos desplegar solo la fecha usaremos el parámetro -displayhint y este especifica la fecha únicamente:
Get-Date -displayhint date
Si deseamos solo desplegar la hora usaremos la siguiente línea:
Get-Date -displayhint timeTambién es posible usar Get-Date para crear un objeto de fecha y hora para cualquier fecha u hora. Por ejemplo, con este comando crearemos una variable llamada $A que se mapea a las 12:00 a.m. del 1 de diciembre de 2017:
$A = Get-Date 12/1/2017
Ahora, si deseamos añadir una hora específica a esta variable basta con agregarla de la siguiente forma:
$A = Get-Date “12/1/2017 11:00 AM”El cmdlet Get-Date también incluye una serie de métodos para hacer aritmética a la fecha de forma simple:
AddSeconds AddMinutes AddHours AddDays AddMonths AddYears
New-TimeSpan $(Get-Date) $(Get-Date -month 10 -day 31 -year 2018)En este caso veremos la cantidad de días entre la fecha de hoy y el 31 de octubre del año 2018:
Podemos ver detalles completos de días, minutos horas y demás. Para usar New-TimeSpan solo será necesario usar un par de valores de fecha y hora. La mejor manera de hacerlo es usar el método Get-Date; eso nos ayuda a garantizar que obtendremos un par de objetos de fecha y hora con los que New-TimeSpan puede trabajar.
En este ejemplo, la primera fecha se hizo usando el cmdlet Get-Date sin ningún parámetro adicional (tenga en cuenta que el cmdlet debe estar entre paréntesis).
Para la segunda fecha también se invocó a Get-Date, pero se añadió los parámetros -month, -day y -year, junto con los valores apropiados.
2. Comandos cmdlets en PowerShell de Seguridad y descriptores de seguridad
Estas tareas incluyen acciones como configurar la política de ejecución de scripts de Windows PowerShell y recuperar la firma digital o el descriptor de seguridad de un archivo o carpeta.
- Restringido (Restricted): No se pueden ejecutar scripts. Windows PowerShell solo se puede usar en modo interactivo.
- AllSigned: Solo se pueden ejecutar scripts firmados por un editor de confianza.
- RemoteSigned: Las secuencias de comandos descargadas deben estar firmadas por un editor de confianza antes de poder ejecutarlas.
Para asignar alguna de estas políticas usaremos la siguiente sintaxis:
Set-ExecutionPolicy (política) Set-ExecutionPolicy UnrestrictedSerá necesario confirmar dicha acción:
3. Comandos cmdlets en PowerShell de archivos y carpetas
Estas tareas incluyen acciones como como crear, renombrar, copiar y eliminar archivos y carpetas.
Copy-Item d:\Solvetic\pruebas.txt c:\Solvetic
Si deseamos copiar todo el contenido de una carpeta, incluyendo subcarpetas, entonces simplemente debemos usar un carácter comodín así:
Copy-Item d:\Solvetic\* c:\Solvetic
Si deseamos copiar solo los archivos con una extensión determinada, por ejemplo, imágenes, usaremos la siguiente línea:
Copy-Item d:\Solvetic\*.jpg c:\Solvetic
En este caso vamos a crear un nuevo directorio denominado Windows PowerShell dentro de la carpeta C:\Solvetic. Para esto, ejecutaremos New-Item junto a la ruta completa a la nueva carpeta y, el nuevo tipo de elemento (que puede especificar utilizando el parámetro -type y el directorio de valores). El comando tendrá la siguiente estructura:
New-Item c:\Solvetic\WindowsPowerShell -type directory
Esto creará dicho elemento en la ruta indicada. Para crear un archivo nuevo, debemos seguir el mismo proceso, especificando el nombre completo de la ruta, pero esta vez configurando el tipo de archivo. Con este comando crearemos el archivo C:\Solvetic\Solvetic1.txt:
New-Item C:\Solvetic\Solvetic1.txt -type file
En caso de que el archivo exista y deseemos sobrescribirlo, podemos añadir el parámetro -force así:
New-Item C:\Solvetic\Solvetic1.txt -type file -force
Si deseamos eliminar un archivo usaremos la siguiente línea:
Remove-Item c:\Solvetic\Solvetic1.txt
También podemos usar caracteres comodín para eliminar varios elementos. Por ejemplo, este comando elimina todos los archivos en la ruta C:\Solvetic:
Remove-Item c:\Solvetic\*Otra de las opciones disponibles es especificar qué elementos se han de eliminar y cuáles no, para ello podemos hacer uso de la siguiente sintaxis:
Remove-Item c:\scripts\* -include *.txt -exclude *Pruebas*En este caso serán eliminados todos los archivos .txt excepto el archivo llamado Pruebas. El cmdlet Remove-Item tiene un parámetro llamado -whatif que en realidad no elimina nada, sino que simplemente nos despliega lo que sucedería si ejecutáramos Remove-Item:
Remove-Item c:\Solvetic\*.txt -whatif
Move-Item c:\Solvetic\Solvetic d:\Solvetic
En caso de que el elemento exista en la ruta de destino podemos usar el parámetro -force para su ejecución:
Move-Item c:\Solvetic\Solvetic d:\Solvetic -force
- La ruta actual para el archivo o la carpeta.
- El nuevo nombre para el archivo o carpeta.
Rename-Item c:\Solvetic\Solvetic Solvetic2
Test-Path c:\Solvetic\Solvetic.txt
Si obtenemos el resultado true el archivo existe, de lo contrario veremos false. Incluso es posible verificar la existencia de claves en el editor de registros del Windows.
Test-Path HKCU:\Software\Microsoft\Windows\CurrentVersion
4. Comandos cmdlets en PowerShell de tareas de administración del sistema
Estas tareas incluyen acciones como iniciar y detener servicios, recuperar datos mediante WMI y administrar registros de eventos y eventos de registro de eventos.
Basta con usar Get-Service sin ningún parámetro adicional:
Get-ServiceEl resultado será el siguiente. Allí podemos ver cada servicio con su nombre y estado actual.
Podemos aplicar filtros para visualizar los servicios con un estado especifico, por ejemplo, para ver todos los servicios en estado Stopped ejecutaremos lo siguiente:
Get-Service | Where-Object {$_.status -eq "stopped"}
Del mismo modo, para ver todos los servicios que están activos ejecutamos:
Get-Service | Where-Object {$_.status -eq "running"}Por defecto, Windows PowerShell devuelve los servicios ordenados alfabéticamente. Sin embargo, al usar el cmdlet Sort-Object, es posible ordenar los datos devueltos de la forma que desee. Por ejemplo, este comando ordena los servicios primero por Estado y luego por DisplayName:
Get-Service | Sort-Object status,displayname
El cmdlet Get-EventLog tiene dos propósitos: Nos permite administrar los registros de eventos y también nos permite acceder a los eventos contenidos en esos registros de eventos.
Para obtener el listado de eventos ejecutaremos lo siguiente. Allí podemos ver las diversas categorías con sus cantidades de eventos.
Get-EventLog -list
Si solo deseamos información sobre un registro de eventos específico, podremos usar el cmdlet Where-Object para limitar la recuperación de datos al registro cuyo LogDisplayName es igual a, en este caso, Sistema:
Get-EventLog -list | Where-Object {$_.logdisplayname -eq "System"}Para listar todos los eventos de una categoría especifica podemos ejecutar la siguiente línea:
Get-EventLog system
También podemos usar el parámetro -newest y obtener solo el último número de eventos anotados en el registro según lo indiquemos:
Get-EventLog system -newest 5
Para obtener mucha más información de un evento ejecutaremos la siguiente línea:
Get-EventLog system -newest 5 | Format-List
También es posible canalizar datos a través del cmdlet Where-Object para devolver un subconjunto de eventos. Por ejemplo, este comando recupera solo aquellos eventos en el registro de eventos de Windows PowerShell que tienen un EventID igual a 403:
Get-EventLog "Windows PowerShell" | Where-Object {$_.EventID -eq 403}
La siguiente opción, permite recuperar todos los eventos en el registro de eventos de Windows PowerShell, y luego usa el cmdlet Group-Object para agrupar esos eventos por EventID.
Get-EventLog "Windows PowerShell" | Group-Object eventid | Sort-Object NameAllí podemos ver la cantidad de veces que ocurrió el evento, el nombre y la descripción.
Set-Service XblAuthManager -startuptype "manual"
Un servicio detenido abandona todas las conexiones existentes y se niega a tomar nuevas conexiones. Un servicio en pausa normalmente continuará dando servicio a las conexiones existentes, pero no aceptará ninguna conexión nueva.
Para esto basta con ejecutar lo siguiente:
Suspend-Service tapisrv
En este caso hemos pausado el servicio de Telefonía usando su nombre de servicio, pero si lo deseamos, podemos usar el nombre del servicio:
Suspend-Service -displayname "telefonia"Para reiniciar un servicio en Windows debemos usar el cmdlet Resume-Service seguido del servicio en pausa:
Resume-Service tapisrv
Get-WmiObject se puede ejecutar en equipos remotos, lo cual significa que realmente es posible usar Windows PowerShell como una herramienta de administración.
Para obtener la información del BIOS podemos ejecutar la siguiente línea:
Get-WmiObject win32_bios
Para asegurarnos de obtener información de todas las propiedades (y sus valores), la mejor opción es canalizar los datos devueltos por Get-WmiObject a Select-Object, y luego usar el carácter comodín * para indicar que deseamos recuperar todos los valores de las propiedades.
Si es necesario obtener las propiedades y métodos para una clase WMI específica, podemos usar Get-WmiObject para conectarnos a una clase en cuestión, y luego canalizar esa información a través del cmdlet Get-Member:
Get-WmiObject win32_bios | get-member
Stop-Service btwdinsPara iniciar un servicio usaremos el cmdlet Start-Service:
Start-Service btwdins
- Con su ID:
Stop-Process 3512
- Por su nombre:
Stop-Process -processname notepad
Stop-Process también acepta caracteres comodín. Por ejemplo, este comando finalizara cualquier instancia de Bloc de notas, así como cualquier otro proceso cuyos nombres comiencen con note:
Stop-Process -processname note*
5. Comandos cmdlets en PowerShell de tareas de ayuda e Información
Estas tareas incluyen aspectos como enumerar la información de la versión de Windows PowerShell y usar el cmdlet Get-Member para recuperar información de propiedades y métodos para un objeto.
Get-Help *
Una vez tengamos este listado, se puede obtener ayuda sobre el tema específico pasando el nombre del tema a Get-Help. Por ejemplo, para obtener más información sobre el cmdlet Get-Member. En ese caso, simplemente ejecutaremos:
Get-Help Get-Member
Get-Command debe ser usado sin ningún parámetro adicional y obtendremos una lista de todos los cmdlets de Windows PowerShell:
Get-Command
Podemos usar el cmdlet Format-List para recuperar las propiedades de los cmdlets:
Get-Command | Format-List *
Es posible usar Select-Object para filtrar todas las propiedades excepto el Nombre:
Get-Command | Select-Object name
Esta información podrá ser exportada a un archivo de texto para su posterior gestión, para ello debemos ejecutar:
Get-Command | Get-Help | Out-File c:\Solvetic\Ayuda.txt
Get-EventLog -list | Get-Member
El parámetro -membertype nos permite limitar los datos devueltos a las propiedades:
Get-WmiObject win32_bios | Get-Member -membertype properties
Para determinar los proveedores disponibles para usted, simplemente llame al cmdlet Get-PSProvider sin ningún parámetro:
6. Comandos cmdlets en PowerShell de sesiones de Windows PowerShell
Estas tareas incluyen tareas como recuperar el historial de Windows PowerShell y volver a invocar un comando contenido dentro de ese historial.
De manera predeterminada, Windows PowerShell realiza un seguimiento de los 64 comandos más recientes escritos en la ventana de la consola. Para visualizar una cantidad específica usaremos el parámetro -count:
Get-History 15 -count 15
Invoke-History 3Esto ejecutar el comando ubicado en la posición número 3:
El cmdlet Invoke-History solo acepta un ID único, en caso de ejecutar más comandos, debemos ejecutar un par de comandos Invoke-History, separando los dos usando un punto y coma:
Invoke-History 3;Invoke-History 4
7. Comandos cmdlets en PowerShell de Almacenamiento e importación de datos
Estas tareas contienen tareas como leer y escribir en archivos de texto, así como guardar datos en formato HTML o XML.
Add-Content c:\Solvetic\Solvetic.txt "Solvetic"
Por defecto, el complemento agrega el nuevo valor inmediatamente después del último carácter en el archivo de texto. Si prefiere que la palabra Solvetic aparezca en una línea separada, simplemente inserte `n (jerga de Windows PowerShell para" nueva línea ") en el valor que se escribe en el archivo.
Add-Content c:\Solvetic\Solvetic.txt "`nSolvetic"
Estos son algunos de los otros caracteres especiales que se pueden usar en el resultado de Windows PowerShell:
`0 - Nulo `a - Alerta `b - Retroceso `n - Nueva línea `r - Retorno de linea `t - Pestaña horizontal `'- Comilla simple `" - Doble comilla
Get-Process | Tee-Object -file c:\Solvetic\Solvetic.txt
Podemos ver que los datos son registrados en pantalla y de forma simultánea en el archivo seleccionado serán guardados:
Clear-Content c:\Solvetic\Solvetic.txt
Get-Process | ConvertTo-Html | Set-Content c:\Solvetic\Solvetic.htmEn este ejemplo, guardaremos todos los procesos del sistema en el archivo Solvetic.txt y lo convertiremos a formato HTML:
Esto creará el archivo HTML el cual podrá ser abierto con cualquier navegador:
Hemos visto como los cmdlets de Windows PowerShell han sido diseñados para ofrecernos la posibilidad de realizar una gestión mucho más directa y completa sobre todos los componentes y servicios del Sistema Operativo.