Guia Basica para nuevos usuarios
Esta guía fue diseñada para introducir a los usuarios en el poderoso y versátil shell de línea de comandos y lenguaje de scripting desarrollado por
Microsoft.
PowerShell es esencial para administrar y automatizar tareas en entornos Windows, permitiendo a los usuarios interactuar con el sistema operativo y otras aplicaciones de manera eficiente.
Antes de comenzar a aprender PowerShell, es útil que el usuario tenga algunos conocimientos y herramientas básicas. Aquí hay una lista de requisitos previos recomendados:
Si hay algún error ortográfico o explicación mal escrita, por favor Contactanos.
Antes de comenzar a configurar nuestro entorno de desarrollo, es importante verificar su version de PowerShell. Para ello utilizaremos el comando Get-Host
o bien utilizar la variable $PSVersionTable
.
Name : ConsoleHost Version : 5.1.19041.3803 InstanceId : a99043e9-42b7-4fb1-9698-b4ad1f094170 UI : System.Management.Automation.Internal.Host.InternalHostUserInterface CurrentCulture : es-AR CurrentUICulture : es-ES PrivateData : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy DebuggerEnabled : True IsRunspacePushed : False Runspace : System.Management.Automation.Runspaces.LocalRunspace
La versión actual de PowerShell es 5.1 y partiremos desde esta version.
Para evitar problemas recomendamos utilizar la version 5.1 o superior.
Para Instalar PowerShell en su ultima version es necesario ingresar en nuestra terminal el siguiente comando:
iex "& { $(irm https://aka.ms/install-powershell.ps1) } -UseMSI"
Tambien puede descargar directame el executable desde PowerShell Releases
Esta es una lista de algunas de las herramientas de PowerShell que estan disponibles para scripting.
Por razones ovideas, no utilizaremos la terminal de PowerShell para escribir los scripts.
En esta guia utilizaremos el editor de texto (Visual Studio Code). pero podemos utilizar cualquieras de la ya mencionada,
Tambien debo resaltar que ISESteroids no es un editor si no una vitamina. para Windows PowerShell ISE.
Windows Powershell ISE es un IDE no es un editor.
Un IDE es una herramienta para escribir, editar, depurar y ejecutar tu código en tiempo real.
Para habilitar Execution de Scripting en PowerShell es necesario ejecutar el siguiente comando.
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
Los Cmdlets son comandos únicamente funcionales bajo Powershell y en .NET. Esto es debido a que PowerShell accede objectos de clase .NET de manera nativa en nuestro sistema. Implica que todo funciona en le mismo ecosistema a diferencia de su predecesor (CMD).
Saber másEn conjunto, estas características hacen de PowerShell una herramienta potente y versátil para la administración y automatización de tareas en entornos Windows.
Los comandos en PowerShell iniciar con un Verbos seguido de un Sustantivo. Los Verbos en PowerShell lo permiten saber que acción va a realizar dicho comando antes de ejecutarlo. En cambio un sustantivo es una palabra que sirve para nombrar cosas materiales o elementos inmateriales.
Hay mucho verbos que indica en PowerShell que acción va a realizar al momento de escribirlo, aquí le dejo una lista de los mas comunes.
Get
- ConseguirSet
- EstablecerRemove
- EliminarEnable
- HabilitarDisable
- DeshabilitarStart
- IniciarAdd
- AgregarWrite
- EscribirNew
- NuevoStop
- DetenerClear
- LimpiarUpdate
- ActualizarReset
- ReiniciarTest
- ProbarSi desea Profundizar le adjunto la documentación oficial en donde habla muchos mas al respecto de los verbos.
El cmdlet Get-Help en PowerShell se utiliza para obtener información detallada sobre los cmdlets, funciones, scripts, módulos, y otros elementos de PowerShell. Proporciona documentación en línea que puede ayudarte a comprender cómo usar y aprovechar las distintas funcionalidades de PowerShell. Aquí tienes una explicación básica junto con un ejemplo de uso:
Get-Help [-Name] cmdletName [-Detailed] [-Examples] [-Full] [-Online]
Ver, Crear, Copiar ,Eliminación , Mover, Renombrar, Comprobar, Obtener Información en archivos y carpetas en PowerShell.
Get-ChildItem lo permitirá obtener los elementos actuales y sub elementos.
Obtener-Directorio -Path C:\Demo ---------------------------------- Get-ChildItem -Path C:\Demo
Directorio: C:\Demo Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2/15/2023 05:29 Demo2 -a---- 2/13/2023 05:55 8014 Demo.txt -ah---- 2/1/2023 08:43 183 Demo.ps1 -ar--- 2/12/2023 14:31 27 SoloLectura.txt
En la salida obtendremos el nombre ,fecha ,Longitud (de los archivos) y Modo.
Voy a hacer énfasis en la salida Mode (Modo). Dicha salida lo esta indicando si se trata de un directorio o archivo y en que estado esta ejemplo si esta oculto, solo lectura ,etc.
Modo | Definición |
---|---|
D | Directorio |
A | Archivo |
R | Solo lectura |
l | Enlace |
H | Oculto |
S | Sistema |
Set-Location
lo permite moverlos libremente como lo hacíamos en su predecesor.
Comando | Definición |
---|---|
Set-Location Nombredeldirectorio | Lo permite moverlos al directorio especificado |
Set-Location .. | Los dos puntos indica que retrocedamos un directorio |
Set-Location / | Retrocedamos a la raiz del directorio |
Set-Location .\ | Del directorio actual desplázate hacia el directorio especificado |
Set-Location "\Users\Username\"
Si vienes de CMD o de BASH puedes utilizar los alias CD o LS.
El cmdlets New-Item
se usa para crear un elementos (directorio o archivo).
Nuevo-Elemento -RutaDondeSeCrearaElElemento 'Ruta\Nombredeldirectorio' -TipodeElemento Directorio --------------------------------------------------------------------------------------------------------- New-Item -Path 'C:\Demo' -ItemType Directory
Nuevo-Elemento -RutaDondeSeCrearaElElemento 'Ruta\Nombredelarchivo.extension' -TipodeElemento Archivo --------------------------------------------------------------------------------------------------------- New-Item -Path 'C:\Users\Username\Desktop\demo.txt' -ItemType File
También podemos decirle que cree un directorio o archivo en el directorio actual remplazando la ruta por un simple punto(.).
Nuevo-Elemento -RutaDondeSeCrearaElElemento 'Punto\Nombredelarchivo.extension' -TipodeElemento Archivo --------------------------------------------------------------------------------------------------------- New-Item -Path ./demo.txt -Type File
Podemos forzar su ejecución para que sobrescriba por el elemento actual utilizando –Force si dicho elemnto ya existe.
Nuevo-Elemento -RutaDondeSeCrearaElElemento 'Punto\Nombredelarchivo.extension' -TipodeElemento Archivo -forzar -------------------------------------------------------------------------------------------------------------- New-Item -Path ./demo.txt -Type File -Force
Para copiar directorio o archivo deberemos utilizar Copy-Item
.
Copiar-Elemento "Ruta->NombreDeldirectorioACopiar" -Destino "Ruta -> Destino" --------------------------------------------------------------------------------- Copy-Item .\Demo\ -Destination C:\
Como podemos observar podemos utilizar el atajo del punto (.) que vimos anteriormente.
Si queremos copiar todos sub directorios, deberemos especificarle el atributo –Recurse.
Copiar-Elemento "Ruta->NombreDeldirectorioACopiar" -Destino "Ruta -> Directorio" -recursivo ------------------------------------------------------------------------------------ Copy-Item .\Demo\* -Destination C:\ -recurse
Si deseamo copiar todo el Contenido a nivel raiz del directorio de destino, podemos utilizar el atajo de asterisco (*)
Copy-Item .\Demo\* -Destination C:\ -recurse
Copiar-Elemento "Ruta->NombreDelArchivoACopiar" -Destino "Ruta -> Destino" --------------------------------------------------------------------------------- Copy-Item .\demo.txt -Destination C:\
También podemos decirle que cambie el nombre o extensión de un archivo solamente modificando la ruta destino.
Copy-Item ".\demo.txt" -Destination "demo.ps1"
Hay otras forma de eliminar archivo y directorio, pero sin duda alguna Remove-Item
es la mas comun.
Eliminar-Elemento .\NombreDelDirectorioOArchivoaEliminar\ ---------------------------------------------------------------------- Remove-Item .\Demo\
A igual que como ocurría anteriormente con Copy-Item
, necesitamos añadirle el atributo -Recurse para elimine todos los subdirectorios y archivos existente.
Eliminar-Elemento .\NombreDelDirectorioOArchivoaEliminar\ -Recursivo ---------------------------------------------------------------------- Remove-Item .\Demo\ -Recurse
Sino especificamos el atributo PowerShell lo pedirá una confirmación .
Eliminar-Elemento C:\Test\NombredelArchivo.NombredelElarchivo(.txt,etc) ------------------------------------------------------------------ Remove-Item C:\Test\*.*
El asterisco (*) esta representado los nombre de los archivos y luego seguido del (.) el segundo asterisco (*) Esta remplazando las extensiones.
Eliminar-Elemento DirectorioActual -Incluir *.doc -Excluir*1* ---------------------------------------------------------------- Remove-Item * -Include *.doc -Exclude *1*
Aquí otro ejemplo practico donde le indicamos que elimine todo los ficheros con la extensión .doc y excluya todos lo que tenga el numero 1 del directorio actua
Eliminar-Elemento -Path C:\ArchivoOculto.txt -Fuerza ---------------------------------------------------------------- Remove-Item -Path C:\ArchivoOculto.txt -Force
Si deseamos forzar la eliminación de un archivo o directorio oculto, podemos utilizar el atributo –Force
Move-Item
lo permitirá mover tanto ficheros como directorios le hallamos especificado.
Mover-Elemento -ruta .\Carpeta\ -Destino .\Carpeta2\ ----------------------------------------------------------------------- Move-Item -Path .\Demo\ -Destination .\Demo2\
Podemos indicarle que mueva todos los archivos especificado.
Mover-Elemento -ruta .\Carpeta\Archivo.extension -Destino .\Carpeta2\ ----------------------------------------------------------------------- Move-Item -Path .\Demo\*.txt -Destination C:\Demo2\
Rename-Item
Lo permite cambiar nombre de elementos.
Renombrar-Item -ruta "c:\Nombre.extension " -NuevoNombre "NuevoNombre.extension " ---------------------------------------------------------------------------------- Rename-Item -Path "c:\demo.txt" -NewName "SoylaMejorDemo.txt"
Test-Path
Lo permite comprobar si un elemento existe.
comprobar-Camino -Ruta "Ruta" -------------------------------------------------------- Test-Path -Path "C:\Demo"
PS C:> Test-Path .\Demo\ True ------------------------------------------ PS C:> Test-Path .\Demo2\ False
Test-Path
devolverá True si el archivo o directorio existe y False si no existe.
Test-Path "HKLM:\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell"
Verificamos si existe la clave de registro.
Get-Content
lo permite obtener el contenido de un archivo.
Obtener-contenido c:nombredelarchivo.extension ------------------------------------------------ Get-Content c:\demo.txt
PS C:\Users\FranciscoBanegas> Get-Content c:\demo.txt Soy la 1 linea Soy la 2 linea Soy la 3 linea Soy la 4 linea
Hablaremos de algunos de los Cmdlets útiles y veremos como funciona.
Controlar el orden de salida de forma ascendente o descendente.
$variable -> Valor Almacenado --------------------------------- $Demo = "A","B","C","D"
Una variable se declara con el signo $ seguido del nombre de la variable, y se encarga de almacenar valores tales como números, cadenas (Texto), booleanos (Verdadero y Falso).
Para este ejemplo e creado una variable de nombre Demo que almacena letras en orden
alfabética, para lograr mostrar el funcionamiento de la instrucción Sort-Object
.
Si llamamos a la variable Demo obtendremos una salida en forma ordenada de la letra A -> D.
A B C D
Como haríamos si queremos que la salida comienzo de la letra D -> A, sin modificar el orden de la variable. Una de la forma de hacerlo es con Sort-Object
.
D C B A
En este ejemplo manipulamos la salida utilizando Sort-object y el atributo –Descending (Descendente).
Get-ChildItem C:\Users\FranciscoBanegas | sort -Descending
Directorio: C:\Users\FranciscoBanegas Mode LastWriteTime Length Name ---- ------------- ------ ---- d-r--- 16/7/2023 17:19 Videos d-r--- 22/6/2023 13:35 Searches d-r--- 22/6/2023 13:34 Saved Games d-r--- 7/7/2023 16:05 Pictures d-r--- 22/6/2023 13:34 Music d-r--- 22/6/2023 13:34 Links d-r--- 22/6/2023 13:34 Favorites d-r--- 27/7/2023 22:35 Documents d-r--- 16/8/2023 01:12 Desktop d----- 13/8/2023 17:20 Demo2 d-r--- 22/6/2023 13:34 Contacts d-r--- 22/6/2023 13:34 3D Objects d----- 24/6/2023 19:58 .vscode d----- 14/8/2023 18:18 .VirtualBox d----- 12/7/2023 12:36 .bito
Como vemos en el segundo ejemplo también podemos combinarlo con otros comandos como Get-Chilidtem
utilizando Pipe (|) y emplear el uso de Alias.
No te preocupe si no tiene idea de que es pipe y un alias, aquí te va una introducción rápida. Un operador de Canalización (Pipelines) es una forma de unir varios comando , un alias hacer referencia a un método corto para llamar al comando. Sencillo no te parece ??.
Este comando nos permite mostrar los alias de los comandos. La sintaxis es Get-Alias
.
CommandType Name Version Source ----------- ---- ------- ------ Alias % -> ForEach-Object Alias ? -> Where-Object Alias ac -> Add-Content Alias asnp -> Add-PSSnapin Alias cat -> Get-Content Alias cd -> Set-Location Alias CFS -> ConvertFrom-String 3.1.0.0 Alias chdir -> Set-Location Alias clc -> Clear-Content Alias clear -> Clear-Host Alias clhy -> Clear-History Alias cli -> Clear-Item Alias clp -> Clear-ItemProperty Alias cls -> Clear-Host Alias clv -> Clear-Variable Alias cnsn -> Connect-PSSession Alias compare -> Compare-Object Alias copy -> Copy-Item Alias cp -> Copy-Item Alias cpi -> Copy-Item Alias cpp -> Copy-ItemProperty Alias curl -> Invoke-WebRequest Alias cvpa -> Convert-Path Alias dbp -> Disable-PSBreakpoint Alias del -> Remove-Item Alias diff -> Compare-Object Alias dir -> Get-ChildItem Alias dnsn -> Disconnect-PSSession Alias ebp -> Enable-PSBreakpoint Alias echo -> Write-Output Alias epal -> Export-Alias Alias epcsv -> Export-Csv Alias epsn -> Export-PSSession Alias erase -> Remove-Item Alias etsn -> Enter-PSSession Alias exsn -> Exit-PSSession Alias fc -> Format-Custom Alias fhx -> Format-Hex 3.1.0.0 Alias fl -> Format-List Alias foreach -> ForEach-Object Alias ft -> Format-Table Alias fw -> Format-Wide Alias gal -> Get-Alias Alias gbp -> Get-PSBreakpoint Alias gc -> Get-Content Alias gcb -> Get-Clipboard 3.1.0.0 Alias gci -> Get-ChildItem Alias gcm -> Get-Command Alias gcs -> Get-PSCallStack Alias gdr -> Get-PSDrive Alias ghy -> Get-History Alias gi -> Get-Item Alias gin -> Get-ComputerInfo 3.1.0.0 Alias gjb -> Get-Job Alias gl -> Get-Location Alias gm -> Get-Member Alias gmo -> Get-Module Alias gp -> Get-ItemProperty Alias gps -> Get-Process Alias gpv -> Get-ItemPropertyValue Alias group -> Group-Object Alias gsn -> Get-PSSession Alias gsnp -> Get-PSSnapin Alias gsv -> Get-Service Alias gtz -> Get-TimeZone 3.1.0.0 Alias gu -> Get-Unique Alias gv -> Get-Variable Alias gwmi -> Get-WmiObject Alias h -> Get-History Alias history -> Get-History Alias icm -> Invoke-Command Alias iex -> Invoke-Expression Alias ihy -> Invoke-History Alias ii -> Invoke-Item Alias ipal -> Import-Alias Alias ipcsv -> Import-Csv Alias ipmo -> Import-Module Alias ipsn -> Import-PSSession Alias irm -> Invoke-RestMethod Alias ise -> powershell_ise.exe Alias iwmi -> Invoke-WmiMethod Alias iwr -> Invoke-WebRequest Alias kill -> Stop-Process Alias lp -> Out-Printer Alias ls -> Get-ChildItem Alias man -> help Alias md -> mkdir Alias measure -> Measure-Object Alias mi -> Move-Item Alias mount -> New-PSDrive Alias move -> Move-Item Alias mp -> Move-ItemProperty Alias mv -> Move-Item Alias nal -> New-Alias Alias ndr -> New-PSDrive Alias ni -> New-Item Alias nmo -> New-Module Alias npssc -> New-PSSessionConfigurationFile Alias nsn -> New-PSSession Alias nv -> New-Variable Alias ogv -> Out-GridView Alias oh -> Out-Host Alias popd -> Pop-Location Alias ps -> Get-Process Alias pushd -> Push-Location Alias pwd -> Get-Location Alias r -> Invoke-History Alias rbp -> Remove-PSBreakpoint Alias rcjb -> Receive-Job Alias rcsn -> Receive-PSSession Alias rd -> Remove-Item Alias rdr -> Remove-PSDrive Alias ren -> Rename-Item Alias ri -> Remove-Item Alias rjb -> Remove-Job Alias rm -> Remove-Item Alias rmdir -> Remove-Item Alias rmo -> Remove-Module Alias rni -> Rename-Item Alias rnp -> Rename-ItemProperty Alias rp -> Remove-ItemProperty Alias rsn -> Remove-PSSession Alias rsnp -> Remove-PSSnapin Alias rujb -> Resume-Job Alias rv -> Remove-Variable Alias rvpa -> Resolve-Path Alias rwmi -> Remove-WmiObject Alias sajb -> Start-Job Alias sal -> Set-Alias Alias saps -> Start-Process Alias sasv -> Start-Service Alias sbp -> Set-PSBreakpoint Alias sc -> Set-Content Alias scb -> Set-Clipboard 3.1.0.0 Alias select -> Select-Object Alias set -> Set-Variable Alias shcm -> Show-Command Alias si -> Set-Item Alias sl -> Set-Location Alias sleep -> Start-Sleep Alias sls -> Select-String Alias sort -> Sort-Object Alias sp -> Set-ItemProperty Alias spjb -> Stop-Job Alias spps -> Stop-Process Alias spsv -> Stop-Service Alias start -> Start-Process Alias stz -> Set-TimeZone 3.1.0.0 Alias sujb -> Suspend-Job Alias sv -> Set-Variable Alias swmi -> Set-WmiInstance Alias tee -> Tee-Object Alias trcm -> Trace-Command Alias type -> Get-Content Alias wget -> Invoke-WebRequest Alias where -> Where-Object Alias wjb -> Wait-Job Alias write -> Write-Output
Como vemos la lista es extensa y eso que no hemos creado nuestros alias. Si quieres buscar un alias específico aquí te muestro un ejemplo.
Get-Alias -Name g*, s* -Exclude *spp,sp*
Estanis indicando que busque los alias comenzados con la letras G y S y excluya los que contenga spp,sp.
CommandType Name Version Source ----------- ---- ------- ------ Alias gal -> Get-Alias Alias gbp -> Get-PSBreakpoint Alias gc -> Get-Content Alias gcb -> Get-Clipboard 3.1.0.0 Alias gci -> Get-ChildItem Alias gcm -> Get-Command Alias gcs -> Get-PSCallStack Alias gdr -> Get-PSDrive Alias ghy -> Get-History Alias gi -> Get-Item Alias gin -> Get-ComputerInfo 3.1.0.0 Alias gjb -> Get-Job Alias gl -> Get-Location Alias gm -> Get-Member Alias gmo -> Get-Module Alias gp -> Get-ItemProperty Alias gps -> Get-Process Alias gpv -> Get-ItemPropertyValue Alias group -> Group-Object Alias gsn -> Get-PSSession Alias gsnp -> Get-PSSnapin Alias gsv -> Get-Service Alias gtz -> Get-TimeZone 3.1.0.0 Alias gu -> Get-Unique Alias gv -> Get-Variable Alias gwmi -> Get-WmiObject Alias sajb -> Start-Job Alias sal -> Set-Alias Alias saps -> Start-Process Alias sasv -> Start-Service Alias sbp -> Set-PSBreakpoint Alias sc -> Set-Content Alias scb -> Set-Clipboard 3.1.0.0 Alias select -> Select-Object Alias set -> Set-Variable Alias shcm -> Show-Command Alias si -> Set-Item Alias sl -> Set-Location Alias sleep -> Start-Sleep Alias sls -> Select-String Alias sort -> Sort-Object Alias start -> Start-Process Alias stz -> Set-TimeZone 3.1.0.0 Alias sujb -> Suspend-Job Alias sv -> Set-Variable Alias swmi -> Set-WmiInstance
Compare-Object
lo permitirá comprobar si dos objecto son idéntico.
Compara-objecto -Referencia (Get-Content -Path .\Demo.txt) -Diferente (Get-Content -Path .\Demo2.txt) ------------------------------------------------------------------------------------------------------ Compare-Object -ReferenceObject (Get-Content -Path .\Demo.txt) -DifferenceObject (Get-Content -Path .\Demo2.txt)
Archivos Demo.txt | Demo2.txt ------------------------------------------- SoyDemo |SoyDemoLinea4 SoyDemoLinea2 |SoyDemoLinea2 SoyDemoLinea3 |SoyDemoLinea3 SoyDemoLinea4 |SoyDemo2
InputObject SideIndicator ----------- ------------- SoyDemo2 => SoyDemo <=
Como vemos la línea de arriba lo que estamos haciendo es comprobar si el contenido dentro de los archivo Demo y Demo2 son idéntico en caso que no lo sea lo arrogara en la salida cual palabra es diferente.
Otro dato importante es Que la comprobación no es de forma línea, lo que quiero decir es que PowerShell es lo suficientemente inteligente para comprobar la palabra sin importar el orden en donde se encuentre.
Recuerden que con Get-Content obtenemos el contenido del archivo Demo.txt y Demo2.txt.
Los comando de Format lo permiten indicar el formato de salida.
Esto significa que lo permitir manipular la salida de diferentes cmdlets por ejemplo get-host
formato de salida es lista, que pasaría si queremos que su salida sea en formato tabla justo para eso están los CMDLets Format
Cmdlets -> Canalización -> FormatodeSalidaTabla -------------------------------------------------- Get-Host | Format-Table
Antes de continuar recordemos que una tabla esta compuesta por filas y colunas.
Con eso dicho lo que estamos diciendo con Format-Table que la información de salida se como una tabla y no una lista.
Get-Host
Name : Visual Studio Code Host Version : 2023.6.0 InstanceId : 6fb73431-75d9-4e2d-b25d-297953cb4f39 UI : System.Management.Automation.Internal.Host.InternalHostUserInterface CurrentCulture : es-AR CurrentUICulture : es-ES PrivateData : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy DebuggerEnabled : True IsRunspacePushed : False Runspace : System.Management.Automation.Runspaces.LocalRunspace
Get-Host
en formato tablaName Version InstanceId UI CurrentCultur e ---- ------- ---------- -- ------------- Visual Studio Code Host 2023.6.0 6fb73431-75d9-4e2d-b25d-297953cb4f39 System.Management.Automation.Internal.Host.InternalHostUserInterface es-AR
Get-ChildItem
Para el ejemplo de formato lista utilizaremos Get-ChildItem
.
Directorio: C:\Users\Username Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 12/7/2023 12:36 .bito d----- 14/8/2023 18:18 .VirtualBox d----- 24/6/2023 19:58 .vscode d-r--- 22/6/2023 13:34 3D Objects d-r--- 22/6/2023 13:34 Contacts d----- 13/8/2023 17:20 Demo2 d-r--- 16/8/2023 01:12 Desktop d-r--- 27/7/2023 22:35 Documents d-r--- 22/6/2023 13:34 Favorites d-r--- 22/6/2023 13:34 Links d-r--- 22/6/2023 13:34 Music d-r--- 7/7/2023 16:05 Pictures d-r--- 22/6/2023 13:34 Saved Games d-r--- 22/6/2023 13:35 Searches d-r--- 16/7/2023 17:19 Videos -a---- 16/8/2023 23:53 52 Demo.txt -a---- 17/8/2023 00:07 55 Demo2.txt
Get-ChildItem
en formato listaDirectorio: C:\Users\FranciscoBanegas Name : .bito CreationTime : 12/7/2023 12:36:23 LastWriteTime : 12/7/2023 12:36:27 LastAccessTime : 16/8/2023 02:01:32 Mode : d----- LinkType : Target : {} Name : .VirtualBox CreationTime : 24/6/2023 19:40:02 LastWriteTime : 14/8/2023 18:18:29 LastAccessTime : 16/8/2023 02:01:32 Mode : d----- LinkType : Target : {} Name : .vscode CreationTime : 24/6/2023 19:58:08 LastWriteTime : 24/6/2023 19:58:13 LastAccessTime : 17/8/2023 16:26:47 Mode : d----- LinkType : Target : {} Name : 3D Objects CreationTime : 22/6/2023 13:34:03 LastWriteTime : 22/6/2023 13:34:03 LastAccessTime : 16/8/2023 23:42:46 Mode : d-r--- LinkType : Target : {} Name : Contacts CreationTime : 22/6/2023 13:34:03 LastWriteTime : 22/6/2023 13:34:03 LastAccessTime : 16/8/2023 02:01:38 Mode : d-r--- LinkType : Target : {} Name : Demo2 CreationTime : 13/8/2023 17:18:50 LastWriteTime : 13/8/2023 17:20:01 LastAccessTime : 16/8/2023 02:01:38 Mode : d----- LinkType : Target : {} Name : Desktop CreationTime : 22/6/2023 13:33:52 LastWriteTime : 16/8/2023 01:12:34 LastAccessTime : 17/8/2023 15:45:58 Mode : d-r--- LinkType : Target : {} Name : Documents CreationTime : 22/6/2023 13:33:52 LastWriteTime : 27/7/2023 22:35:56 LastAccessTime : 16/8/2023 02:01:38 Mode : d-r--- LinkType : Target : {} Name : Favorites CreationTime : 22/6/2023 13:33:52 LastWriteTime : 22/6/2023 13:34:03 LastAccessTime : 16/8/2023 02:01:38 Mode : d-r--- LinkType : Target : {} Name : Links CreationTime : 22/6/2023 13:33:52 LastWriteTime : 22/6/2023 13:34:03 LastAccessTime : 16/8/2023 23:47:59 Mode : d-r--- LinkType : Target : {} Name : Music CreationTime : 22/6/2023 13:33:52 LastWriteTime : 22/6/2023 13:34:03 LastAccessTime : 16/8/2023 02:01:38 Mode : d-r--- LinkType : Target : {} Name : Pictures CreationTime : 22/6/2023 13:33:52 LastWriteTime : 7/7/2023 16:05:24 LastAccessTime : 16/8/2023 02:01:38 Mode : d-r--- LinkType : Target : {} Name : Saved Games CreationTime : 22/6/2023 13:33:52 LastWriteTime : 22/6/2023 13:34:03 LastAccessTime : 16/8/2023 23:42:46 Mode : d-r--- LinkType : Target : {} Name : Searches CreationTime : 22/6/2023 13:34:03 LastWriteTime : 22/6/2023 13:35:10 LastAccessTime : 16/8/2023 02:01:38 Mode : d-r--- LinkType : Target : {} Name : Videos CreationTime : 22/6/2023 13:33:52 LastWriteTime : 16/7/2023 17:19:07 LastAccessTime : 17/8/2023 04:25:57 Mode : d-r--- LinkType : Target : {} Name : Demo.txt Length : 52 CreationTime : 16/8/2023 23:42:55 LastWriteTime : 16/8/2023 23:53:42 LastAccessTime : 17/8/2023 16:29:59 Mode : -a---- LinkType : Target : {} VersionInfo : File: C:\Users\FranciscoBanegas\Demo.txt InternalName: OriginalFilename: FileVersion: FileDescription: Product: ProductVersion: Debug: False Patched: False PreRelease: False PrivateBuild: False SpecialBuild: False Language: Name : Demo2.txt Length : 55 CreationTime : 16/8/2023 23:43:19 LastWriteTime : 17/8/2023 00:07:23 LastAccessTime : 17/8/2023 16:29:59 Mode : -a---- LinkType : Target : {} VersionInfo : File: C:\Users\FranciscoBanegas\Demo2.txt InternalName: OriginalFilename: FileVersion: FileDescription: Product: ProductVersion: Debug: False Patched: False PreRelease: False PrivateBuild: False SpecialBuild: False Language:
Format-Wide
El formato de salida Amplio (Wide) es un formato de tabla que lo permite manipular la salida.
Get-ChildItem | Format-Wide -Column 3
Directorio: C:\Users\FranciscoBanegas .bito .VirtualBox .vscode 3D Objects Contacts Demo2 Desktop Documents Favorites Links Music Pictures Saved Games Searches Videos Demo.txt Demo2.txt
En este ejemplo le hemos dicho que me muestre los directorios pero en 3 colunas. También podemos decirle que lo redimensione utilizando el atributo –AutoSize .
Get-ChildItem | Format-Wide -Column 3 -AutoSize
Directorio: C:\Users\FranciscoBanegas .bito .VirtualBox .vscode 3D Objects Contacts Demo2 Desktop Documents Favorites Links Music Pictures Saved Games Searches Videos Demo.txt Demo2.txt
Get-Host | Format-Wide -Property Version
Otra característica de este formato, es que lo permite selecciona una propiedad en concreto utilizando el atributo Property
2023.6.0
Obtener el historial
Id CommandLine -- ----------- 1 Get-Host 2 Get-Host | Format-Table 3 get-childItem 4 get-childItem | Format-List 5 clear 6 get-childItem | Format-Table 7 Get-Host 8 $psversiontable 9 Get-Host | Format-Table 10 Get-Host
Escribe un mensaje personalizado de salida.
Mensaje normal --------------------------------------------- Write-Host "Hola Mundo" --------------------------------------------- Mensaje personalizado --------------------------------------------- Write-Host ("Hola", "Mundo") -Separator ", -> " -ForegroundColor white -BackgroundColor red
ForegroundColor -> Color de letra
BackgroundColor -> Color de fondo
Separator -> Permite asignarle un separador, es necesario declararlo entre paréntesis y la coma indica que finalizo la palabra.
Según Microsoft Read-Host
, Lee una línea de entrada de la consola. Si bien la definición es precisa , permítanme darle una definición mas tosca. El siguiente comando lo permitirá formular una pregunta y luego espera una respuesta, dicha repuesta puede ser almacenada en una variable para que luego realice una acción.
$Respuesta= Read-Host "Como te llamas ??" Write-host $repuesta -Separator ", -> " -ForegroundColor white -BackgroundColor red
Read-Host Ingresar la contraseña -AsSecureString
En el siguiente ejemplo le estamos diciendo con el atributo AsSecureString que proteja o oculte los datos escritos para que no arrogue en la salida.
Start-Sleep
permite pausar la ejecución de un comando.
Abre bloc de notas -> suspende la ejecución y luego de 5 segundo -> cierra bloc de notas --------------------------------------------------------------------------------------- Notepad.exe; Start-Sleep -Seconds 5; Stop-Process -Name notepad
Es decidido mostrarle este ejemplo ya que lo muestra claramente el potencial que tiene dicho comando y importante entender que puede ejecutar aplicaciones, script y también pasarle otros cmdlets.
Select-Object
permite seleccionar un objeto de una lista de objetos.
Get-Host | select version
Version ------- 2023.6.0
Administrar procesos es una tareas importante que deberemos dominar.
Get-process
lo permite obtener una lista de los procesos que se están ejecutando en la sesión actual de Windows.
Get-process
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName -------- ----- ----- ------ -- -- ----------- 9 2,27 4,12 0,00 2796 0 amdfendrsr 21 5,22 78,54 46,91 14056 2 AMDRSServ 20 10,62 26,83 0,50 11512 2 ApplicationFrameHost 17 4,32 14,98 0,00 8080 2 atieclxx 12 7,26 12,48 37,86 7384 0 audiodg 9 1,50 1,06 0,02 9612 2 cncmd 43 143,38 87,99 23,19 444 2 Code 7 1,69 7,91 0,02 10008 2 CompPkgSrv 8 1,31 6,08 0,08 3728 2 conhost 21 1,98 3,57 0,00 744 0 csrss 37 3,56 6,11 0,00 3588 2 csrss 21 21,84 24,73 10,06 10984 2 ctfmon 45 1.435,47 41,25 102,95 11144 2 devsense.php.ls 14 12,81 23,78 0,02 6476 2 Discord 67 269,15 134,57 0,00 9540 2 dwm 103 168,34 123,83 38,98 2168 2 explorer 5 1,25 2,25 0,00 1240 0 fontdrvhost 10 6,12 7,58 0,00 12320 2 fontdrvhost 0 0,06 0,01 0,00 0 0 Idle 32 35,71 42,47 0,38 8008 2 LockApp 9 1,37 2,99 0,00 1048 0 LsaIso 27 8,48 16,94 0,00 1068 0 lsass 0 2,81 1.189,24 0,00 2620 0 Memory Compression 19 14,25 23,62 0,00 6420 0 MoUsoCoreWorker 18 123,98 127,90 42,80 5612 2 msedge 99 354,10 262,77 0,00 4616 0 MsMpEng 44 37,59 52,62 94,84 8988 2 NGenuity2Helper 12 9,25 9,71 0,00 5732 0 NisSrv 13 3,04 14,18 0,05 7900 2 notepad 17 6,73 18,82 353,70 9692 2 xampp-control
Si te estas preguntado que son las letras que aparecen al principios (Handles,NPM,etc) no te preocupes es muy sencillo de entender una vez que vea la siguiente tabla.
Modo | Definición |
---|---|
Handles | El número de descriptores de archivo de entrada-salida. |
NPM(K) | Memoria no pagina , representada en KB que nuca se pagina en el disco. |
PM(K) | Memoria que puede ser paginada. |
WS(K) | Espacio de memoria física representado en KB |
CPU(s) | Tiempo utilizado del CPU por el proceso. |
ID | Identificado único. |
SI | ID de sesión – 0 > Se ejecuta en todas la secciones – 1 > Se ejecuta solo en el usuario actual – 2 > Se ejecuta solo en los usuario con una sesión activa. |
ProcessName | Nombre del proceso. |
Para obtener información de un proceso específico por ejemplo el ultimo proceso de la lista xampp-control podemos simplemente decirle que filtre por la palabra reservada en este caso xampp
get-Process xampp*
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName ------ ----- ----- ------ -- -- ----------- 17 6,73 18,83 357,75 9692 2 xampp-control
Una alternativa mas avanzada para seleccionar siempre el ultimo proceso es llamarlo como un array almacenado en una variable y hacer mención de el con un índice negativo [-1]
$a = Get-Process $a[-1]
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName ------ ----- ----- ------ -- -- ----------- 17 6,73 18,84 364,69 9692 2 xampp-control
Podemos indincarle el nombre del usuario de quien ejecuto dicho proceso.
Get-Process xampp-control -IncludeUserName
WS(M) CPU(s) Id UserName ProcessName ----- ------ -- -------- ----------- 19,29 377,62 9692 DESKTOP-22LMN6O\FranciscoBane… xampp-control
Start-Process
Permite Iniciar uno o múltiples procesos en simultaneo.
Start-Process -FilePath "RutadelProceso/NombreDelProceso"
Si llamamos a una aplicación directa del System32 no es necesario especificar la ruta, en cambio si es una aplicación diferente es necesario especificar la ubicación del ejecutable.
Start-Process -FilePath "notepad.exe" ------------------------------------------- start-process -FilePath "C:\Program Files\Parsec\parsecd.exe"
Start-Process -FilePath "notepad.exe" -Verb RunAs
# Lista de aplicaciones que deseas ejecutar $aplicaciones = "notepad.exe", "calc.exe", "explorer.exe" # Iniciar cada aplicación en la lista $procesos = $aplicaciones | ForEach-Object { Start-Process -FilePath $_ -PassThru }
Stop-Process
Permite detener uno o más procesos.
Stop-Process -ID IDDelProceso -------------------------------- Stop-Process -Name NOMBREdelProceso
Get-Process -Name notepad NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName ------ ----- ----- ------ -- -- ----------- 12 2,49 13,96 0,12 6928 2 notepad
Stop-Process -Name Notepad
Stop-Process -ID "6928"
En este ejemplo filtramos por el nombre y luego le indicamos con Stop-Process que detenga el proceso.
Get-Service
Lo arroja una lista de los servicios que se encuentran en la máquina.
Get-Service
Status Name DisplayName ------ ---- ----------- Stopped AJRouter Servicio de enrutador de AllJoyn Stopped ALG Servicio de puerta de enlace de niv... Stopped AppIDSvc Identidad de aplicación Running Appinfo Información de la aplicación Stopped AppMgmt Administración de aplicaciones Stopped AppReadiness Preparación de aplicaciones Stopped AppVClient Microsoft App-V Client Running AppXSvc Servicio de implementación de AppX ... Stopped AudioEndpointBu... Compilador de extremo de audio de W... Stopped Audiosrv Audio de Windows Stopped AxInstSV Instalador de ActiveX (AxInstSV) Running BFE Motor de filtrado de base Stopped BITS Servicio de transferencia inteligen... Running BrokerInfrastru... Servicio de infraestructura de tare... Stopped bthserv Servicio de compatibilidad con Blue... Running camsvc Servicio Administrador de funcional... Stopped CaptureService_... CaptureService_70fdc Running cbdhsvc_70fdc Servicio de usuario del portapapele... Running CDPSvc Servicio de plataforma de dispositi...
Podemos filtrar por los servicios, que comienzen con X letra utilizando el caracter *
Get-Service "user*"
Status Name DisplayName ------ ---- ----------- Stopped UserDataSvc_70fdc Acceso a datos de usuarios_70fdc Running UserManager Administrador de usuarios
En varias ocasiones vamos a necesitar filtrar los servicio que contengan una palabra clave especificada.
Para ello podemos utilizar -displayName "*audio*"
para que filtre los servicios que contengan la palabra
Get-Service -DisplayName '*audio*'
Status Name DisplayName ------ ---- ----------- Stopped AudioEndpointBu... Compilador de extremo de audio de W... Stopped Audiosrv Audio de Windows Stopped QWAVE Experiencia de calidad de audio y v...
Para excluir un servicio podemos utilizar -Exclude
Get-Service -Name "wi*"
Get-Service -Name "wi*" -Exclude "WinRM"
Status Name DisplayName ------ ---- ----------- Stopped WiaRpc Eventos de adquisición de imágenes ... Running WinDefend Servicio Antivirus de Microsoft Def... Running WinHttpAutoProx... Servicio de detección automática de... Running Winmgmt Instrumental de administración de W... Running WinRM Administración remota de Windows (W... Stopped wisvc Servicio de Windows Insider
Status Name DisplayName ------ ---- ----------- Stopped WiaRpc Eventos de adquisición de imágenes ... Running WinDefend Servicio Antivirus de Microsoft Def... Running WinHttpAutoProx... Servicio de detección automática de... Running Winmgmt Instrumental de administración de W... Stopped wisvc Servicio de Windows Insider
Podemos filtrar los servicios por su estado, generalmente es muy utilizado para saber si un servicio esta en ejecucion o detenido.
Con Where-Object
estamos obteniendo Status de los servicios y finalmente con el operador -eq
evalue si es igual a Running.
En caso que sea igual lo devolverá los servicios que esten en ejecucion.
Get-Service -Name 'ssh*' | Where-Object {$_.Status -eq 'Running'}
Status Name DisplayName ------ ---- ----------- Running ssh-agent OpenSSH Authentication Agent Running sshd OpenSSH SSH Server
Para iniciar un servicio utilizaremos Start-Service
.
Start-Service -Name 'eventlog'
Status Name DisplayName ------ ---- ----------- Running eventlog Registro de eventos de Windows
Para iniciar varios servicios en simultáneo hay multiples maneras de hacerlo. En este ocasion utilizare la manera mas comun que se suele utilizar.
Primero crearemos una variable que contenga los nombres de los servicios que queremos iniciar. Luego utilizaremos un bucle Foreach
para que itere por cado uno de sus elementos y finalmente con Start-Service
inicialice los Servicios.
Ya vimos algo similar en la seccion de Admistrar Procesos mas puntualmente en Abrir múltiples procesos almacenado en un Array.
# Lista de servicios a iniciar $servicios = "Servicio1", "Servicio2", "Servicio3" # Utilizando un bucle foreach para iniciar cada servicio foreach ($servicio in $servicios) { Start-Service -Name $servicio }
En este ejemplo iniciare un servicio y lo guardaremos en un archivo de texto, permitiéndoles tener un registro del servicio que se inicializo o que se detuvo.
$Service = Get-Service eventlog Start-Service -InputObject $Service -PassThru | Format-List >> log.txt
Name : eventlog DisplayName : Registro de eventos de Windows Status : Running DependentServices : {Wecsvc, Tailscale, AppVClient, netprofm...} ServicesDependedOn : {} CanPauseAndContinue : False CanShutdown : True CanStop : True ServiceType : Win32OwnProcess, Win32ShareProcess
Es importante tener en cuenta que el archivo de texto se creará en el directorio actual. donde se encuentre situado en la terminal
Para detener un servicio utilizaremos Stop-Service
.
Stop-Service -Name 'ssh-agent'
Lo mas habitual al detener un servicio basico es agregarle el parámetro -PassThru
esto con el fin de obtener el nombre del servicio y si su estado fue detenido
Stop-Service -Name 'ssh-agent' -PassThru
Status Name DisplayName ------ ---- ----------- Stopped ssh-agent OpenSSH Authentication Agent
Los cmdlets de fecha y hora lo permiten manipular fecha y hora actuales.
Get-Date
Permite ver la fecha y hora actual.
Get-Date ------------------------ Salida ------------------------ martes, 22 de agosto de 2023 17:54:10
También podemos pasarle el Argumento –DisplayHint
para ver la date (Fecha) o time (Tiempo).
Get-Date -DisplayHint Date ------------------------ Salida ------------------------ martes, 22 de agosto de 2023
Get-Date -DisplayHint Time ----------------------------- Salida ----------------------------- 17:57:40
Si deseamos manipular el formato de salida de la fecha.
Get-Date -Format "dddd MM/dd/yyyy" ---------------------------------- Salida ---------------------------------- martes 08/22/2023
Valores | Definición |
---|---|
dddd | Nombre completo del día de la semana |
MM | Numero del mes – 2 Digito |
dd | Dia – 2 Digito |
yyyy | Año – 4 Digito |
HH:mm | Hora Actual |
Tambien podemos lograr algo similamente utilizando –UFormat
Get-Date -UFormat "%A %m/%d/%Y %R" --------------------------------------- Salida --------------------------------------- martes 08/22/2023 18:12
Valores | Definición |
---|---|
%A | Nombre completo del día de la semana |
%m | Numero del mes – 2 Digito |
%d | Dia – 2 Digito |
%Y | Año – 4 Digito |
%R | Hora Actual |
Para saber mas sobre Get-Date
recomiendo pegarle una ojeada a la documentacion.
Set-Date
Permite ver la fecha y hora actual.
Set-Date -Date (Get-Date).AddDays(3)
Añadimos mas días utilizando el método .AddDays().
.
Utilizando –adjust
podemos retrasar la hora o adelantar el tiempo.
Set-Date -Adjust -0:20:0 -DisplayHint Time
Le estamos Indicando con el valor negativo (-) que retrase el tiempo, si deseamos avanzar en el tiempo solo deberíamos quita el signo (–) .