PowerShell#
PowerShell es una interfaz de consola con posibilidad de escritura y unión de comandos por medio de instrucciones. Es compatible con muchas plataformas, incluyendo Windows, macOS y Linux. PowerShell se distribuye bajo la licencia MIT, que es una licencia de software libre y de código abierto
Los cmdlets (comandos) de PowerShell son comandos simples que se utilizan para realizar tareas específicas dentro de PowerShell, trabajan directamente con objetos .NET y sus métodos, podemos ver todos los los cmdlets, funciones u scripts con Get-Command
Un objeto es una instancia de una clase, los objetos tienen propiedades (atributos o campos) y métodos, por ejemplo :
# Obtener la fecha y hora actuales
$date = Get-Date
# Acceder a una propiedad
$day = $date.Day # Obtiene el día del mes
$year = $date.Year # Obtiene el año
# Llamar a un método
$newDate = $date.AddDays(5) # Añade 5 días a la fecha actual
Podemos ver todas las propiedades de un cmdlet con Get-Member:
PS C:\> Get-Member -InputObject (Get-Date) -MemberType Properties
TypeName: System.DateTime
Name MemberType Definition
---- ---------- ----------
DisplayHint NoteProperty DisplayHintType DisplayHint=DateTime
Date Property datetime Date {get;}
Day Property int Day {get;}
DayOfWeek Property System.DayOfWeek DayOfWeek {get;}
DayOfYear Property int DayOfYear {get;}
Hour Property int Hour {get;}
Kind Property System.DateTimeKind Kind {get;}
Millisecond Property int Millisecond {get;}
Minute Property int Minute {get;}
Month Property int Month {get;}
Second Property int Second {get;}
Ticks Property long Ticks {get;}
TimeOfDay Property timespan TimeOfDay {get;}
Year Property int Year {get;}
DateTime ScriptProperty System.Object DateTime {get=if ((& { Set-StrictMode -Version 1; $this.Di.
Tambén los metodos:
PS C:\Users\Administrador> Get-Member -InputObject (Get-Date) -MemberType Method
TypeName: System.DateTime
Name MemberType Definition
---- ---------- ----------
Add Method datetime Add(timespan value)
AddDays Method datetime AddDays(double value)
AddHours Method datetime AddHours(double value)
AddMilliseconds Method datetime AddMilliseconds(double value)
AddMinutes Method datetime AddMinutes(double value)
AddMonths Method datetime AddMonths(int months)
AddSeconds Method datetime AddSeconds(double value)
AddTicks Method datetime AddTicks(long value)
AddYears Method datetime AddYears(int value)
CompareTo Method int CompareTo(System.Object value), int CompareTo(datetime value), ...
Equals Method bool Equals(System.Object value), bool Equals(datetime value), bool...
GetDateTimeFormats Method string[] GetDateTimeFormats(), string[] GetDateTimeFormats(System.I...
GetHashCode Method int GetHashCode()
GetObjectData Method void ISerializable.GetObjectData(System.Runtime.Serialization.Seria...
GetType Method type GetType()
GetTypeCode Method System.TypeCode GetTypeCode(), System.TypeCode IConvertible.GetType...
IsDaylightSavingTime Method bool IsDaylightSavingTime()
Subtract Method timespan Subtract(datetime value), datetime Subtract(timespan value)
ToBinary Method long ToBinary()
ToBoolean Method bool IConvertible.ToBoolean(System.IFormatProvider provider)
ToByte Method byte IConvertible.ToByte(System.IFormatProvider provider)
ToChar Method char IConvertible.ToChar(System.IFormatProvider provider)
ToDateTime Method datetime IConvertible.ToDateTime(System.IFormatProvider provider)
ToDecimal Method decimal IConvertible.ToDecimal(System.IFormatProvider provider)
ToDouble Method double IConvertible.ToDouble(System.IFormatProvider provider)
ToFileTime Method long ToFileTime()
ToFileTimeUtc Method long ToFileTimeUtc()
ToInt16 Method int16 IConvertible.ToInt16(System.IFormatProvider provider)
ToInt32 Method int IConvertible.ToInt32(System.IFormatProvider provider)
ToInt64 Method long IConvertible.ToInt64(System.IFormatProvider provider)
ToLocalTime Method datetime ToLocalTime()
ToLongDateString Method string ToLongDateString()
ToLongTimeString Method string ToLongTimeString()
ToOADate Method double ToOADate()
ToSByte Method sbyte IConvertible.ToSByte(System.IFormatProvider provider)
ToShortDateString Method string ToShortDateString()
ToShortTimeString Method string ToShortTimeString()
ToSingle Method float IConvertible.ToSingle(System.IFormatProvider provider)
ToString Method string ToString(), string ToString(string format), string ToString(...
ToType Method System.Object IConvertible.ToType(type conversionType, System.IForm...
ToUInt16 Method uint16 IConvertible.ToUInt16(System.IFormatProvider provider)
ToUInt32 Method uint32 IConvertible.ToUInt32(System.IFormatProvider provider)
ToUInt64 Method uint64 IConvertible.ToUInt64(System.IFormatProvider provider)
ToUniversalTime Method datetime ToUniversalTime()
Control de procesos y servicios#
ps -> Get-Process ver procesos
kill -> Stop-Process mata procesos
Get-Service -ProcessName <servicio>
Stop-Service -ProcessName <servicio>
Start-Service -ProcessName <servicio>
Suspend-Service -ProcessName <servicio>
Ejemplo:
calc.exe
Get-Process -ProcessName CalculatorApp
Stop-Process -ProcessName CalculatorApp
calc.exe
Stop-Process -Id 2828
Alias [1]#
New-Alias -Name "ver" -Value Get-ChildItem
Get-Alias ver los alias que hay en el sistema
Ficheros y directorios#
pwd -> Get-Location donde te encuentras
cp -r -> Copy-Item copiar
mv -> Move-Item mover, renombrar
rm, rm -r -> Remove-Item borrar
mkdir crear directorio
ls -> Get-ChildItem listar archivos y carpetas, para ver los archivos ocultos -h
l (vínculo)
d (directorio)
a (archivo)
r (solo lectura)
h (oculto)
s (sistema)
echo -> Write-Output repetir salida estándar
Test-Path -Path <archivo> nos dice si exite el archivo o carpeta
Get-Help -Name Get-ChildItem obtener ayuda
Ejemplo:
PS C:\> pwd
Path
----
C:\
PS C:\> mkdir A
Directorio: C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 29/03/2024 9:27 A
PS C:\> cd A
PS C:\A> mkdir B
Directorio: C:\A
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 29/03/2024 9:27 B
PS C:\A> mkdir C
Directorio: C:\A
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 29/03/2024 9:27 C
PS C:\A> ls
Directorio: C:\A
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 29/03/2024 9:27 B
d----- 29/03/2024 9:27 C
-a---- 29/03/2024 9:28 8 archivo.dat
PS C:\A> Test-Path D
False
PS C:\A> Test-Path B
True
PS C:\A> pwd
Path
----
C:\A
PS C:\A> mv B D
PS C:\A> cp -r D F
PS C:\A> ls
Directorio: C:\A
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 29/03/2024 9:27 C
d----- 29/03/2024 9:27 D
d----- 29/03/2024 9:29 F
-a---- 29/03/2024 9:28 8 archivo.dat
PS C:\A> rm F
PS C:\A> ls
Directorio: C:\A
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 29/03/2024 9:27 C
d----- 29/03/2024 9:27 D
-a---- 29/03/2024 9:28 8 archivo.dat
Caracteres especiales#
* (Asterisco):
Se utiliza como comodín para hacer coincidir cero o más caracteres en una ruta o nombre de archivo, por ejemplo, para listar todos los archivos .txt en un directorio, puedes usar:
Get-ChildItem C:\Directorio\*.txt
? (Signo de interrogación):
Se utiliza como comodín para hacer coincidir un único carácter en una ruta o nombre de archivo, por ejemplo, para listar todos los archivos que tengan una extensión de tres caracteres en un directorio, puedes usar:
Get-ChildItem C:\Directorio\???.*
\ (Barra invertida):
Se utiliza como separador de ruta en las rutas de archivo y directorio en Windows.
cd C:\Directorio
" (Comillas dobles):
Se utilizan para delimitar cadenas de texto que contienen espacios u otros caracteres especiales, por ejemplo, para especificar un nombre de archivo con espacios al usar un comando como Get-ChildItem:
Get-ChildItem "C:\Directorio con Espacios\Archivo.txt"
> (Redireccionamiento de salida):
Se utiliza para redirigir la salida de un comando hacia un archivo (sobrescribiendo el archivo si ya existe), por ejemplo, para guardar la salida de un comando en un archivo de texto:
Get-Process > procesos.txt
>> (Redireccionamiento de salida, añadir al final del archivo):
Se utiliza para redirigir la salida de un comando y agregarla al final de un archivo (sin sobrescribir el contenido existente), por ejemplo, para agregar la salida de un comando al final de un archivo de registro:
Get-Date >> registro.txt
$_ (Token) y la | (Tubería o pipe):
El token es una variable automática del objeto actual y la tubería se utiliza para pasar la salida de un comando como entrada a otro comando, por ejemplo, para filtrar la salida de un comando usando Where-Object, puedes usar:
Get-Process | Where-Object { $_.Name -eq "explorer" } Get-Process | Where-Object { $_.CPU -gt 100 }
Trabajando con objetos#
Hemos visto algunos ejemplos como Get-Command, Get-Member, encontramos mas cmdlets interesante para la manipulació de objetos:
Select-Object Selecciona propiedades específicas de un objeto o un conjunto de objetos, permitiendo filtrar y proyectar datos.
Get-Process | Select-Object Name, CPU # Name CPU # ---- --- # cmd 0 # conhost 0,0625 # conhost 0,5 # csrss 0,546875 # csrss 0,125 # . # . # .
Where-Object Filtra objetos en una colección basándose en una condición lógica.
# Filtrar los procesos que están usando más de 100 segundos de tiempo de CPU PS C:\A> Get-Process | Where-Object { $_.CPU -gt 100 } Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName ------- ------ ----- ----- ------ -- -- ----------- 1523 113 56432 62976 179,81 528 0 lsass 688 199 220020 129600 161,33 1800 0 MsMpEng 280 20 10876 12840 119,36 1604 0 svchost # Obtener los procesos que han estado ejecutándose por más de una hora PS C:\> Get-Process | Where-Object { $_.StartTime -lt (Get-Date).AddHours(-1) } Handles NPM(K) PM(K) WS(K) CPU(s) Id ------- ------ ----- ----- ------ -- 71 5 2216 4060 0,00 04 151 11 6704 16640 0,06 72 89 7 1172 5524 0,25 88 333 15 1796 5992 0,59 68 190 12 1744 8884 0,13 44 402 33 21376 29240 40,86 32 # Filtrar los procesos que están utilizando más de 100 MB de memoria Get-Process | Where-Object { $_.WorkingSet -gt 100MB } # Filtrar procesos ejecutados por un usuario específico Get-Process | Where-Object { $_.StartInfo.UserName -eq "Usuario1" } # Filtrar procesos que no responden Get-Process | Where-Object { $_.Responding -eq $false }
Sort-Object Ordena una colección de objetos según una o más propiedades.
Get-Process | Sort-Object CPU -Descending # Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName # ------- ------ ----- ----- ------ -- -- ----------- # 1521 113 56476 63008 179,89 528 0 lsass # 687 198 224592 141488 161,36 1800 0 MsMpEng # 253 14 10544 12600 119,41 1604 0 svchost # 993 39 22360 44860 95,70 360 0 svchost # 401 33 20508 28288 30,86 1632 0 dfsrs # 760 43 8184 24432 18,48 836 0 svchost # 1055 0 40 140 8,22 4 0 System # 470 19 4100 10436 5,36 844 0 svchost # . # . # .
New-Object Crea una instancia de un objeto .NET u otro tipo de objeto.
$obj = New-Object -TypeName PSObject -Property @{Name="Tutankamón"; Age=3358} # PS C:> $obj # # Age Name # --- ---- # 3358 Tutankamón # # PS C:> $obj.Name # Tutankamón
ForEach-Object Ejecuta un bloque de script en cada objeto de una colección que pasa a través del pipeline.
Get-Process | ForEach-Object { $_.Name.ToUpper() }
Measure-Object Calcula propiedades estadísticas de objetos como el recuento, suma, promedio, etc.
Get-Process | Measure-Object CPU -Sum
Group-Object Agrupa los procesos por su nombre.
Get-Process | Group-Object Name
Visualizadores de archivos, filtros y búsqueda de información#
more mostrar archivos haciendo pausa en cada pantalla
cat -> Get-Content visualizar el contenido archivo
Get-Content archivo.dat -tail 10 -wait es como el comando tail -f en GNULinux
(Get-Content archivo.dat)[2] podemos ver la linea 3
select -> Select-Object se utiliza para procesar cada objeto en un flujo de datos.
% -> ForEach-Object se utiliza para seleccionar y proyectar propiedades específicas de un objeto.
Get-Content -head 3 archivo.dat | select -Last 1
sls -> Select-String = grep filtrar,
Select-String -Pattern <texto> -Quiet nos devuelve el texto o nada
ft -> Format-Table dar a la salida formato de tabla :
Get-Service | Format-Table -Property Name, DependentServices
Ejemplo:
PS C:\> cat archivo.dat
1 linea
2 linea
3 linea
4 linea
5 linea
PS C:\> (Get-Content archivo.dat)[2]
3 linea
PS C:\> Get-Content -head 3 archivo.dat | select -last 1
3 linea
PS C:\> Get-Content -head 3 archivo.dat | select -First 3
1 linea
2 linea
3 linea
PS C:\> vi .\archivo.dat # % -> ForEach-Object
PS C:\> Get-Content archivo.dat | %{ $_ -replace '2', 'B' }
1 linea
B linea
3 linea
4 linea
5 linea
PS C:\> Get-Content archivo.dat | %{ $_ -replace '2', 'B' } | sort
1 linea
3 linea
4 linea
5 linea
B linea
PS C:\> sls 2 archivo.dat
archivo.dat:2:2 linea
PS C:\> sls linea archivo.dat
archivo.dat:1:1 linea
archivo.dat:2:2 linea
archivo.dat:3:3 linea
archivo.dat:4:4 linea
archivo.dat:5:5 linea
PS C:\> sls linea archivo.dat -Quiet
True
PS C:\> sls J archivo.dat -Quiet
False
PS C:\> Get-Content archivo.dat | Select-String -Pattern 2
2 linea
PS C:\> Get-Content archivo.dat | Select-String -Pattern liena
PS C:\> Get-Content archivo.dat | Select-String -Pattern linea
1 linea
2 linea
3 linea
4 linea
5 linea
PS C:\> Get-Service | Format-Table -Property Name, Displayname | select -First 4
Name DisplayName
---- -----------
ADWS Servicios web de Active Directory
AJRouter Servicio de enrutador de AllJoyn
Información de harware#
Get-PSDrive cmdlet obtiene las unidades de la sesión actual.
Get-NetAdapter en PowerShell te mostrará información sobre las interfaces de red
Get-WmiObject optener información sobre el procesador
Get-CimInstance se utiliza para recuperar instancias de una clase
Ejemplo:
PS C:\> Get-PSDrive
Name Used (GB) Free (GB) Provider Root CurrentLocation
---- --------- --------- -------- ---- ---------------
Alias Alias
C 8,28 91,07 FileSystem C:\
Cert Certificate \
D FileSystem D:\
Env Environment
Function Function
HKCU Registry HKEY_CURRENT_USER
HKLM Registry HKEY_LOCAL_MACHINE
Variable Variable
WSMan WSMan
PS C:\> Get-PSDrive -PSProvider FileSystem
Name Used (GB) Free (GB) Provider Root CurrentLocation
---- --------- --------- -------- ---- ---------------
C 8,28 91,07 FileSystem C:\
D FileSystem D:\
PS C:\> Get-PSDrive -PSProvider FileSystem | Select-Object Name, Used, Free
Name Used Free
---- ---- ----
C 8886775808 97782759424
D 0
PS C:\> Get-PSDrive -PSProvider FileSystem | Select-Object Name, Used, Free | Select-Object -Index 0
Name Used Free
---- ---- ----
C 8886775808 97782759424
PS C:\> $particion_C=$(Get-PSDrive -PSProvider FileSystem | Select-Object Name, Used, Free | Select-Object -Index 0)
PS C:\> echo $particion_C.Used
8886775808
PS C:\> $porcentaje=100*$particion_C.Used/($particion_C.Used+$particion_C.Free)
PS C:\> echo $porcentaje
8,33112827263359
PS C:\> $porcentaje=[math]::Round(100*$particion_C.Used/($particion_C.Used+$particion_C.Free),2)
PS C:\> echo $porcentaje
8,33
PS C:\> echo "El $porcentaje % de la partición C esta ocupada"
El 8.33 % de la partición C esta ocupada
Ejemplo:
PS C:\> (Get-WmiObject Win32_Processor).caption
Intel64 Family 6 Model 142 Stepping 10
PS C:\> (Get-WmiObject Win32_ComputerSystem).SystemType
x64-based PC
PS C:\> (Get-WmiObject Win32_Processor).name
Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz
PS C:\> ((Get-WmiObject Win32_Processor).name).split("@")[1]
1.60GHz
PS C:\> Get-WmiObject -Class Win32_Processor | Select -Property Name, Number*
Name NumberOfCores NumberOfEnabledCore NumberOfLogicalProcessors
---- ------------- ------------------- -------------------------
Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz 2 2
PS C:\> Get-WmiObject -Class Win32_Processor | Select-Object NumberOfCores
NumberOfCores
-------------
2
PS C:\> Get-WmiObject win32_processor | Select-Object LoadPercentage
LoadPercentage
--------------
44
PS C:\> Get-WmiObject -class "Win32_Processor"| % {
>> Write-Host "CPU ID: "
>> Write-Host $_.DeviceID
>> Write-Host "CPU Model: "
>> Write-Host $_.Name
>> Write-Host "CPU Cores: "
>> Write-Host $_.NumberOfCores
>> Write-Host "CPU Max Speed: "
>> Write-Host $_.MaxClockSpeed
>> Write-Host "CPU Status: "
>> Write-Host $_.Status
>> Write-Host
>> }
CPU ID:
CPU0
CPU Model:
Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz
CPU Cores:
2
CPU Max Speed:
1800
CPU Status:
OK
Ejemplo:
PS C:\> Get-CimInstance -ClassName Win32_OperatingSystem
SystemDirectory Organization BuildNumber RegisteredUser SerialNumber Version
--------------- ------------ ----------- -------------- ------------ -------
C:\Windows\system32 20348 Usuario de Windows 00454-40000-00001-AA444 10.0.20348
PS C:\> $(Get-CimInstance -ClassName Win32_OperatingSystem).FreePhysicalMemory
986776
PS C:\> $(Get-CimInstance -ClassName Win32_OperatingSystem).TotalVirtualMemorySize
3276340
PS C:\> $(Get-CimInstance -ClassName Win32_OperatingSystem).NumberOfUsers
6
PS C:\> $(Get-CimInstance -ClassName Win32_OperatingSystem).BootDevice
\Device\HarddiskVolume1
PS C:\> $(Get-CimInstance -ClassName Win32_OperatingSystem).Version
10.0.20348
PS C:\> $(Get-CimInstance -ClassName Win32_OperatingSystem).WindowsDirectory
C:\Windows
PS C:\> $(Get-CimInstance -ClassName Win32_OperatingSystem).CountryCode
34
Configuración de Windows (PowerShell)#
Reiniciar
shutdown /r shutdown /f #de forma forzosa
Apagar
shutdown /s
Consultar IP
ipconfig
Cambiar IP
netsh interface ip set address name="Ethernet" source=static addr=10.4.104.100 mask=255.0.0.0 gateway=10.0.0.2
Cambiar y consultar el DNS
ipconfig /all #consultar dns netsh interface ip set dns "Ethernet" static 8.8.8.8
Cambiar el nombre del equipo
Rename-Computer -NewName "WS22tunombre"
Habilitar ping
netsh advfirewall firewall add rule name="Habilitar respuesta ICMP IPv4" protocol=icmpv4:8,any dir=in action=allow
Instalar el servidor ssh#
#Primero buscamos características disponibles en línea que coincidan con el patrón
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
#Luego la añadimos:
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
#Iniciar el servicio ssh :
Start-Service sshd
#Para reiniciarlo
Restart-Service sshd
#Para iniciar el servicio ssh durante el arranque de forma automática:
Set-Service -Name sshd -StartupType Automatic
#Para conectarse sin contraseña primero copia tu clave publica
scp -P22 .ssh/id_rsa.pub Administrador@IP:C:\Users\Administrador\.ssh\authorized_keys
#Después ya te puedes conectar sin meter contraseña
ssh -X Administrador@IP
Para instalarlo con un solo comando:
Add-WindowsCapability -Online -Name $(Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.server*' | Select-Object Name| Select-Object -Index 0)
En el caso que que quieras conectarte a una sesión de powershell, abre el archivo .ssh/config. Si no existe, puedes crearlo y agrega las siguientes líneas, sonde la <ip> es la ip o el nombre del equipo al que nos conectamos y queremos loguarnos directamente con powershell:
Host <ip>
RequestTTY force
RemoteCommand powershell -NoLogo -NoProfile
Instalar edior vi#
Con Chocolatey:
#Instalar Chocolatey (si aún no lo tienes): Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) choco install vim
Sin Chocolatey [1]:
# Visita el sitio oficial de Vim para Windows en https://www.vim.org/download.php # Descarga el instalador adecuado para tu sistema, en mi caso: curl.exe https://ftp.nluug.nl/pub/vim/pc/gvim90.exe -o gvim90.exe # Ejecutalo dentro de Windows, o desde una conexsión en la que se exporte el display ./gvim90.exe # Crea un alias: Set-Alias -Name vi -Value 'C:\Program Files (x86)\Vim\vim90\vim.exe' # Configuración de vi: cat .vimrc filetype plugin indent off
Footnotes
Gestión de usuarios#
Para ser administrador
start-process powershell -verb runas
Listar usuarios, grupos y usuarios del grupo
Get-LocalUser Get-LocalGroup Get-LocalGroupMember -Name "nombre_grupo"
Crear un usuario con contraseña
$Password = Read-Host -AsSecureString New-LocalUser -Name nombre_usuario -Password $Password #Sin que pida confirmación $Password = ConvertTo-SecureString "alumno" -AsPlainText -Force
Crear un usuario sin contraseña
New-LocalUser -Name "nombre_usuario" -NoPassword #Se la podemos asignar después: Set-LocalUser -Name "nombre_usuario" -Password $Password
Asignar usuario a un grupo
Add-LocalGroupMember -Group "nombre_grupo" -Member "nombre_usuario"
Eliminar un usuario
Remove-LocalUser -Name "nombre_usuario"
Crear y borrar un grupo
New-LocalGroup -Name "nombre_grupo" Remove-LocalGroup -Name "nombre_grupo"