Los módulos de PowerShell son los paquetes que añaden comandos a la consola: el que administra Microsoft 365, el que consulta Active Directory, el que instala las actualizaciones de Windows o el que crea hojas de Excel sin tener Excel. Esta guía explica qué son, dónde se guardan, cómo instalar un módulo de PowerShell con Install-Module o con Install-PSResource, cómo actualizar módulos de PowerShell sin acumular copias y qué hacer cuando aparece el error No match was found. Además, todo lo que verá aquí lo medimos el 28 de octubre de 2026 en un Windows 11 sin permisos de administrador, con Windows PowerShell 5.1 y con PowerShell 7.6.9.
La guía tiene dos niveles. Si solo necesita instalar un módulo y seguir con su trabajo, lea los tres primeros apartados y el de errores. Si administra equipos o escribe scripts que otros ejecutan, siga hasta las versiones, los repositorios y los escenarios. Para un primer contacto con la consola, antes conviene leer nuestra guía de PowerShell.
Qué son los módulos de PowerShell
Un módulo es una carpeta con un nombre, una versión y uno o varios archivos que PowerShell sabe cargar. Dentro, por ejemplo, puede haber funciones escritas en PowerShell, comandos compilados en una DLL o ambas cosas. El archivo que lo describe es el manifiesto, con extensión .psd1: dice qué versión es, qué comandos exporta y qué necesita para funcionar.
Windows, de hecho, ya trae decenas de módulos. Por eso Get-Service o Get-ChildItem funcionan sin instalar nada. Lo que falta, como las herramientas de Microsoft 365, de Azure o de terceros, se descarga de la Galería de PowerShell (PowerShell Gallery), el repositorio público de Microsoft.
| Tipo de módulo | Qué contiene | Ejemplo |
|---|---|---|
| Módulo de script | Un archivo .psm1 con funciones de PowerShell | ImportExcel |
| Módulo binario | Una DLL compilada en .NET | PSWindowsUpdate |
| Módulo de manifiesto | Un .psd1 que agrupa otros módulos o archivos | Microsoft.Graph, que reúne decenas de submódulos |
| Módulo del sistema | Viene con Windows o con PowerShell | Microsoft.PowerShell.Management, ScheduledTasks |
Por otra parte, en el equipo de prueba, Get-Module -ListAvailable encontró 141 módulos en Windows PowerShell 5.1 y 125 en PowerShell 7. Sin embargo, la mayoría eran del sistema.
Para qué sirven los módulos de PowerShell: usos comunes y beneficios
Hoy, casi toda la administración por consola pasa por un módulo. Por eso, esta tabla reúne los que más aparecen en el trabajo de soporte, con la versión que publicaba la Galería el día de la prueba.
| Tarea | Módulo | Versión en la Galería (28-10-2026) | Guía relacionada |
|---|---|---|---|
| Usuarios, licencias y grupos de Microsoft 365 | Microsoft.Graph | 2.41.2 | Microsoft 365 PowerShell |
| Buzones y correo | ExchangeOnlineManagement | 3.10.1 | Exchange Online PowerShell |
| Sitios de SharePoint | Microsoft.Online.SharePoint.PowerShell | 16.0.27709.12000 | SharePoint Online PowerShell |
| Equipos y directivas de Teams | MicrosoftTeams | 8.0.0 | Microsoft Teams PowerShell |
| Recursos de Azure | Az | 16.4.0 | No aplica |
| Actualizaciones de Windows | PSWindowsUpdate | 2.2.1.5 | No aplica |
| Leer y crear archivos de Excel | ImportExcel | 7.8.10 | No aplica |
| Administrar SQL Server | dbatools | 2.9.1 | No aplica |
| Probar scripts | Pester | 6.2.0 | No aplica |
Usar módulos de PowerShell en lugar de copiar funciones sueltas tiene ventajas claras:
- Se instalan con una orden y luego se actualizan con otra, sin buscar instaladores.
- Tienen versión: puede saber qué versión ejecuta cada equipo y fijar la que necesita un script.
- Se cargan solos: basta con escribir un comando para que PowerShell importe su módulo.
- Se reparten igual en todos los equipos, sea desde la Galería o desde un repositorio interno.
- Traen ayuda:
Get-HelpyGet-Command -Modulefuncionan con cualquier módulo bien hecho.
Dónde se guardan los módulos de PowerShell
PowerShell busca módulos en las carpetas de la variable de entorno PSModulePath, en el orden en que aparecen. Además, Windows PowerShell 5.1 y PowerShell 7 tienen carpetas distintas, así que un módulo instalado en una consola no siempre existe en la otra.
| Ámbito | Windows PowerShell 5.1 | PowerShell 7 |
|---|---|---|
| Solo su usuario (CurrentUser) | Documentos\WindowsPowerShell\Modules | Documentos\PowerShell\Modules |
| Todos los usuarios (AllUsers) | C:\Program Files\WindowsPowerShell\Modules | C:\Program Files\PowerShell\Modules |
| Los que trae la propia consola | C:\Windows\System32\WindowsPowerShell\v1.0\Modules | La carpeta Modules de la instalación de PowerShell 7 |
PowerShell 7 también lee las carpetas de la 5.1, por eso ve muchos de sus módulos. Para consultar las carpetas en su equipo:
$env:PSModulePath -split ';'
[Environment]::GetFolderPath('MyDocuments')
La segunda línea importa más de lo que parece. Microsoft advierte en about_PSModulePath que OneDrive puede cambiar la ubicación de Documentos, y así estaba en el equipo de prueba: la carpeta de módulos del usuario vivía dentro de OneDrive y ocupaba 1.106,7 MB en la 5.1 y 1.157,3 MB en la 7. En resumen, son más de 2 GB que OneDrive sincroniza a la nube y a cualquier otro equipo de la misma cuenta.
PowerShellGet, PSResourceGet y PackageManagement
Por otro lado, para instalar módulos de PowerShell desde la Galería hay dos familias de comandos. Por eso conviene saber cuál tiene cada consola, ya que la mayoría de los errores vienen de una versión vieja.
| Herramienta | Comandos | Qué versión trae Windows o PowerShell | Estado |
|---|---|---|---|
| PowerShellGet 1.0.0.1 con PackageManagement 1.0.0.1 | Install-Module, Find-Module | La que trae Windows PowerShell 5.1 | Sin soporte de Microsoft |
| PowerShellGet 2.2.5 con PackageManagement 1.4.8.1 | Install-Module, Update-Module | Incluida en PowerShell 7 | Versión vigente |
| Microsoft.PowerShell.PSResourceGet 1.2.0 | Install-PSResource, Update-PSResource | Incluida desde PowerShell 7.4 | La que Microsoft recomienda |
Para ver lo que tiene su consola:
Get-Module -ListAvailable PowerShellGet, PackageManagement, Microsoft.PowerShell.PSResourceGet |
Format-Table Name, Version, ModuleBase
Medimos dos diferencias que justifican el cambio que pide Microsoft. En primer lugar, cargado a propósito el PowerShellGet 1.0.0.1 de fábrica, Find-Module respondió PowerShell Gallery no está disponible actualmente. Vuelve a intentarlo más tarde., tanto con TLS 1.0 como con TLS 1.2. La Galería, en cambio, funcionaba con normalidad: el problema era la versión. En segundo lugar está la velocidad. Con el mismo módulo, ImportExcel, PSResourceGet fue además varias veces más rápido:
| Operación con ImportExcel | PowerShellGet en 5.1 | PowerShellGet en 7 | PSResourceGet en 7 |
|---|---|---|---|
Descargar a una carpeta (Save-Module / Save-PSResource) | 17,1 s | 22,3 s | 3,3 s |
Instalar la versión 7.8.6 (Install-Module / Install-PSResource) | 79,4 s | 39,6 s | 6,2 s |
Actualizar a la 7.8.10 (Update-Module / Update-PSResource) | 17,1 s | 29,4 s | 8,5 s |
Desde luego, los tiempos dependen de la red y del equipo, pero la diferencia se repitió en todas las pruebas. Además, los dos juegos de comandos conviven sin problema: PSResourceGet no depende de PowerShellGet.
Cómo instalar un módulo de PowerShell paso a paso
En general, estos pasos sirven en cualquier equipo con Windows 10 u 11. No hace falta ser administrador si instala solo para su usuario.
1. Compruebe si ya lo tiene
Get-Module -ListAvailable -Name ImportExcel
Si la orden no devuelve nada, entonces el módulo no está en ninguna carpeta de PSModulePath.
2. Búsquelo en la Galería de PowerShell
Find-Module -Name ImportExcel
Find-Module -Name 'ExchangeOnline*'
El asterisco busca por parte del nombre. Por ejemplo, con ExchangeOnline* aparecieron ExchangeOnlineManagement y ExchangeOnlineManagement.SAM: así se descubre el nombre exacto cuando no se recuerda. Y si sabe el comando pero no el módulo, búsquelo por el comando:
Find-Module -Command Get-WindowsUpdate
Esa búsqueda devolvió PSWindowsUpdate en primer lugar, seguido de otros módulos que también exportan un comando con ese nombre. Antes de instalar, mire quién lo publica y cuántas descargas tiene en la ficha de la Galería: allí publican Microsoft y también la comunidad.
3. Instálelo para su usuario
Install-Module -Name ImportExcel -Scope CurrentUser
Con PSResourceGet, en cambio, la orden equivalente es:
Install-PSResource -Name ImportExcel
Además, la primera vez PowerShell puede preguntar dos cosas, y lo hace en inglés. Si falta el proveedor NuGet, pide instalarlo: responda Y (Yes). Si la Galería figura como repositorio no fiable (Untrusted repository), pregunta si quiere instalar desde él: responda Y o A (Yes to All). Son avisos normales, no errores.
4. Úselo
No hace falta importar el módulo. De hecho, en la prueba, ImportExcel no estaba cargado; bastó con Get-Command Export-Excel para que PowerShell lo encontrara y lo cargara solo. Esa carga automática funciona con cualquier módulo que esté en PSModulePath. Import-Module solo hace falta para elegir una versión concreta o para cargar un módulo que está en otra carpeta:
Import-Module -Name ImportExcel
Get-Command -Module ImportExcel | Measure-Object
En este caso, ImportExcel exportó 76 comandos.
Ámbito del módulo de PowerShell: CurrentUser o AllUsers
El parámetro -Scope de Install-Module decide dónde se instala. Si no lo escribe, el valor depende de la versión: según Microsoft, PowerShellGet 1.x instala para todos los usuarios y exige elevar; con la 2.x en PowerShell 7, una consola normal instala para su usuario y una consola elevada, para todos. PSResourceGet instala siempre para el usuario si no se indica otra cosa.
| Ámbito | Quién lo ve | Necesita administrador | Cuándo usarlo |
|---|---|---|---|
| CurrentUser | Solo su cuenta | No | Su equipo de trabajo |
| AllUsers | Todas las cuentas y las tareas programadas que se ejecutan como SYSTEM | Sí | Servidores y equipos compartidos |
Al pedir -Scope AllUsers sin elevar, Windows PowerShell respondió Administrator rights are required to install modules in 'C:\Program Files\WindowsPowerShell\Modules', y el mensaje propone añadir -Scope CurrentUser. Recuerde, además, que una tarea que se ejecuta como SYSTEM no ve los módulos de su usuario: si un script de una tarea programada con PowerShell necesita un módulo, instálelo para todos.
Actualizar PowerShellGet en Windows PowerShell 5.1
Si usa la 5.1 y Get-Module -ListAvailable PowerShellGet solo muestra la 1.0.0.1, actualícelo antes de nada. Son los pasos que publica Microsoft:
[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12
Install-Module -Name PowerShellGet -Repository PSGallery -Scope CurrentUser -Force -AllowClobber
Después, cierre la consola y abra una nueva: la versión vieja sigue cargada en la sesión que hizo la instalación. En cambio, si trabaja con PowerShell 7, ya tiene PowerShellGet 2.2.5 y PSResourceGet.
Cómo actualizar módulos de PowerShell
Para actualizar un módulo instalado desde la Galería basta, en principio, con una orden. Use el mismo ámbito con el que lo instaló:
Update-Module -Name ImportExcel
Update-PSResource -Name ImportExcel
La primera es de PowerShellGet y la segunda de PSResourceGet. Update-Module sin nombre actualiza todos los módulos que conoce, lo que puede tardar mucho si tiene Microsoft.Graph o Az.
Al actualizar, la versión anterior del módulo de PowerShell no se borra
Es el hallazgo que más sorprende. Primero instalamos ImportExcel 7.8.6 y lo actualizamos con Update-Module. Resultado, igual en las dos consolas:
| Lo que se consultó | Resultado |
|---|---|
Get-InstalledModule ImportExcel | 7.8.10 |
Get-InstalledModule ImportExcel -AllVersions | 7.8.10 y 7.8.6 |
Get-Module -ListAvailable ImportExcel | 7.8.10 y 7.8.6 |
Versión que carga Import-Module ImportExcel | 7.8.10 |
Es decir, las dos versiones quedan en carpetas distintas, una al lado de la otra, y PowerShell carga la más reciente. Por eso, un equipo que actualiza durante años acumula copias. Para quitar la vieja:
Uninstall-Module -Name ImportExcel -RequiredVersion 7.8.6
En la prueba funcionó a la primera. Sin embargo, la documentación de Update-PSResource dice que «no hay ningún comando» para desinstalar las versiones anteriores y que hay que borrar sus carpetas a mano, pero Uninstall-Module -RequiredVersion lo hizo, y Uninstall-PSResource tiene su propio parámetro -Version.
Update-Module solo conoce lo que instaló Install-Module
Update-Module y Get-InstalledModule solo ven los módulos que se instalaron con Install-Module. En cambio, lo que llegó con un instalador, se copió a mano o se descargó con Save-Module no cuenta. Por ejemplo, en el equipo de prueba, Get-InstalledModule conocía 3 de los 141 módulos visibles en la 5.1 y 42 de los 125 en la 7.
Si intenta actualizar un módulo copiado a mano, la respuesta es Module 'ImportExcel' was not installed by using Install-Module, so it cannot be updated. En ese caso, la solución es instalarlo con Install-Module -Name ImportExcel -Force y borrar después la carpeta de la copia antigua.
Desinstalar un módulo de PowerShell: cierre antes la consola
Un módulo con DLL queda en uso hasta que se cierra la sesión, aunque se descargue con Remove-Module. Por ejemplo, al intentar desinstalar ImportExcel en la misma consola en la que se había cargado, PowerShellGet respondió The version '7.8.10' of module 'ImportExcel' is currently in use. Retry the operation after closing the applications. y no borró nada.
Con PSResourceGet fue peor, porque además el aviso engaña: Uninstall-PSResource dio un error al no poder borrar EPPlus.dll, y después Get-InstalledPSResource ya no listaba el módulo, pero la carpeta seguía en el disco con esa DLL dentro. Por lo tanto, abra una consola nueva, sin importar nada, y desinstale desde ahí.
El error «No match was found»: causas y soluciones
El mensaje completo es No match was found for the specified search criteria and module name 'X'. Try Get-PSRepository to see all available registered module repositories. Sale con Find-Module y con Install-Module, y significa que el repositorio no tiene un módulo con ese nombre, al menos que pueda ver. Para entenderlo, primero lo provocamos con ocho nombres distintos, y la causa no siempre es la misma.
| Nombre buscado | Por qué no lo encuentra | Qué hacer |
|---|---|---|
| AzureAD, AzureADPreview, MSOnline | Microsoft los retiró y ya no aparecen en la Galería | Pasar a Microsoft.Graph |
| ActiveDirectory, GroupPolicy | No viven en la Galería: son parte de las herramientas RSAT de Windows | Instalar la característica de Windows |
| ExchangeOnline, Microsoft-Graph | El nombre está mal escrito | Buscar con comodín: Find-Module 'ExchangeOnline*' |
| Get-WindowsAutoPilotInfo | Es un script, no un módulo | Install-Script en lugar de Install-Module |
| Cualquiera, con PowerShellGet 1.0.0.1 | La versión de fábrica de la 5.1 ya no funciona con la Galería | Actualizar PowerShellGet |
Módulos retirados: AzureAD y MSOnline
Microsoft dejó los módulos AzureAD, AzureADPreview y MSOnline en desuso el 30 de marzo de 2024, y MSOnline quedó retirado el 30 de mayo de 2025. La Galería ya no los lista: Find-Module -Name AzureAD falla incluso con -AllVersions. Aun así, hay un matiz curioso: Find-Module -Name MSOnline -RequiredVersion 1.1.183.81 todavía encontró esa versión exacta. Sin embargo, instalarla no sirve de nada, porque el servicio al que se conectaba ya no existe.
Si un script viejo le da este error, el camino es reescribirlo con Microsoft Graph, según la guía de migración de Microsoft y como explicamos en la guía de Microsoft 365 PowerShell.
Módulos que no están en la Galería: Active Directory
Muchos buscan Install-Module ActiveDirectory y reciben el mismo error. El módulo de Active Directory viene con las Herramientas de administración remota del servidor (RSAT), que en Windows 11 se instalan como característica opcional y exigen una consola elevada:
Add-WindowsCapability -Online -Name 'Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0'
En Windows Server, la orden es Install-WindowsFeature -Name RSAT-AD-PowerShell. Lo mismo pasa, por cierto, con GroupPolicy, DnsServer o DhcpServer. Además, el detalle está en nuestra guía de Active Directory PowerShell.
Nombre mal escrito o comando que no sabe de dónde viene
El módulo de Exchange no se llama ExchangeOnline, sino ExchangeOnlineManagement, y el de Graph es Microsoft.Graph, con punto. Por lo tanto, antes de dar un módulo por inexistente, búsquelo por parte del nombre o por el comando que quiere usar:
Find-Module -Name '*Exchange*' | Select-Object Name, Version, Author
Find-Module -Command Connect-ExchangeOnline
La columna Author ayuda a separar: con *Exchange* salieron 67 módulos, entre ellos ExchangeOnlineManagement de Microsoft Corporation. Ese campo, sin embargo, lo escribe quien publica, así que confirme el propietario en la ficha de la Galería antes de instalar.
Es un script, no un módulo
La Galería también guarda scripts sueltos, que, sin embargo, se instalan con otro comando. Al buscar Get-WindowsAutoPilotInfo con Find-Module, la respuesta fue The name 'Get-WindowsAutoPilotInfo' is a Script not a Module. En cambio, con Find-Script apareció la versión 3.9:
Install-Script -Name Get-WindowsAutoPilotInfo -Scope CurrentUser
PowerShellGet viejo, TLS o red
Si el error sale con cualquier nombre, incluso con módulos que sin duda existen, el problema está en su consola o en su red:
- Mire la versión de PowerShellGet. Con la 1.0.0.1 de fábrica la Galería no responde, como medimos más arriba.
- Compruebe que la Galería está registrada con
Get-PSRepository. Si no aparece PSGallery, recupérela conRegister-PSRepository -Default. - Revise el protocolo. La Galería exige TLS 1.2. En la 5.1, forzando TLS 1.0,
Invoke-WebRequestcontra la Galería falló conNo se puede crear un canal seguro SSL/TLS.Por suerte, PowerShellGet 2.2.5 se defiende solo: la variable de protocolo valíaSystemDefaultal abrir la consola yTls12después de su primera búsqueda. - Si sale a internet por un proxy, indíquelo:
Install-Module -Name ImportExcel -Proxy 'http://proxy:8080' -ProxyCredential (Get-Credential).
Con PSResourceGet el mensaje cambia, pero la causa es la misma: Package 'AzureAD' could not be found in any registered repositories.
Otros errores frecuentes con módulos de PowerShell
| Mensaje | Qué significa | Solución |
|---|---|---|
Administrator rights are required to install modules in ... | Pidió -Scope AllUsers sin elevar | Use -Scope CurrentUser o abra la consola como administrador |
Module 'X' was not installed by using Install-Module, so it cannot be updated. | El módulo llegó por otra vía | Instálelo con Install-Module -Force y borre la copia vieja |
Module 'X' was not updated because no valid module was found in the module directory. | No está instalado en ninguna carpeta de PSModulePath | Instálelo primero |
The version 'X' of module 'Y' is currently in use. | Está cargado en alguna consola | Cierre las consolas y desinstale desde una nueva |
No match was found for the specified search criteria and module names 'X'. al desinstalar | Uninstall-Module no lo instaló | Borre su carpeta a mano |
No se puede ejecutar el script ... porque faltan los siguientes módulos | El script tiene #Requires -Modules y el módulo falta o es más antiguo | Instale o actualice el módulo que nombra |
| La ejecución de scripts está deshabilitada | Directiva de ejecución | Vea la guía de PowerShell |
Hay, por último, un caso más que conviene conocer. Si el módulo que instala trae un comando con el mismo nombre que otro módulo ya instalado, Install-Module se detiene para no tapar el existente. El parámetro -AllowClobber le permite seguir, y entonces el comando nuevo gana. Si después necesita el original, entonces llámelo con el nombre de su módulo delante: medimos que Microsoft.PowerShell.Utility\Get-FileHash seguía funcionando aunque otro módulo exportara un Get-FileHash propio.
Varias versiones del mismo módulo de PowerShell
Tener dos versiones instaladas no es un error y a veces es justo lo que se necesita. Con las versiones 7.8.6 y 7.8.10 de ImportExcel en la misma carpeta, esto es lo que hizo PowerShell:
Import-Module ImportExcelcargó la 7.8.10, la más reciente.Import-Module ImportExcel -RequiredVersion 7.8.6cargó la vieja.- Importar la otra versión en la misma sesión no reemplazó la primera: quedaron cargadas las dos.
Por eso, si un script depende de una versión, dígalo en la primera línea del script:
#Requires -Modules @{ ModuleName = 'ImportExcel'; ModuleVersion = '7.8.0' }
ModuleVersion es la versión mínima. Si falta, PowerShell 7 se niega a ejecutar el script con un mensaje claro en español: No se encuentra el módulo "ImportExcel" con ModuleVersion "99.0" en nuestra prueba, que pedía una versión inexistente.
Módulos de Windows PowerShell en PowerShell 7
PowerShell 7 carga casi todos los módulos de la 5.1. Por ejemplo, PSWindowsUpdate declara que es para la edición Desktop (la 5.1), y aun así, descargado en una carpeta de usuario, PowerShell 7 lo cargó con sus 28 comandos. Según la documentación de compatibilidad, Microsoft solo aplica esa comprobación a los módulos de la carpeta System32; para esos usa una sesión de compatibilidad en segundo plano. Si un módulo falla en la 7, pruébelo en la 5.1 antes de buscar otra causa.
Comandos de módulos de PowerShell más usados
| Para qué | PowerShellGet | PSResourceGet |
|---|---|---|
| Buscar en la Galería | Find-Module | Find-PSResource |
| Instalar | Install-Module | Install-PSResource |
| Actualizar | Update-Module | Update-PSResource |
| Desinstalar | Uninstall-Module | Uninstall-PSResource |
| Ver lo instalado | Get-InstalledModule | Get-InstalledPSResource |
| Descargar sin instalar | Save-Module | Save-PSResource |
| Ver repositorios | Get-PSRepository | Get-PSResourceRepository |
| Cambiar un repositorio | Set-PSRepository | Set-PSResourceRepository |
| Añadir un repositorio | Register-PSRepository | Register-PSResourceRepository |
| Instalar un script | Install-Script | Install-PSResource |
Y los comandos del propio PowerShell, que funcionan con cualquier módulo, venga de donde venga:
| Comando | Qué hace |
|---|---|
Get-Module | Muestra los módulos cargados en la sesión |
Get-Module -ListAvailable | Muestra todos los que hay en las carpetas de PSModulePath |
Import-Module | Carga un módulo; con -RequiredVersion, una versión concreta |
Remove-Module | Lo descarga de la sesión, sin desinstalarlo |
Get-Command -Module X | Lista los comandos de un módulo |
(Get-Module X).Version | Dice qué versión está usando |
Configuración recomendada
Decida si confía en la Galería de PowerShell
De fábrica, la Galería de PowerShell figura como repositorio no fiable y cada instalación pide confirmación. Puede marcarla como fiable:
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
Set-PSResourceRepository -Name PSGallery -Trusted
Son dos ajustes independientes. En el equipo de prueba, PowerShellGet tenía la Galería como fiable y PSResourceGet no, porque cada herramienta guarda su propia configuración. Así, en un puesto de trabajo, confiar ahorra preguntas. Por el contrario, en un servidor es mejor dejar la confirmación: en la Galería también publica la comunidad, no solo Microsoft.
Un repositorio interno para sus propios módulos de PowerShell
Si su equipo de TI escribe funciones propias, una carpeta compartida sirve como repositorio. Lo probamos con PSResourceGet en una carpeta local: Publish-PSResource dejó en ella un archivo .nupkg con el nombre y la versión del módulo, y Install-PSResource lo instaló desde ahí.
Register-PSResourceRepository -Name Interno -Uri '\\servidor\modulos' -Trusted
Publish-PSResource -Path 'C:\Desarrollo\MiModulo' -Repository Interno
Install-PSResource -Name MiModulo -Repository Interno
Módulos de PowerShell para equipos sin internet
Un servidor sin salida a internet recibe los módulos copiados. Save-Module descarga sin instalar y deja la estructura de carpetas que PowerShell espera, con el nombre y la versión:
New-Item -ItemType Directory -Path 'C:\Temp\Modulos' -Force | Out-Null
Save-Module -Name PSWindowsUpdate -Path 'C:\Temp\Modulos' -Repository PSGallery
La carpeta de destino tiene que existir antes: sin la primera línea, Save-Module falla con Cannot find the path. PSWindowsUpdate ocupó 1.352 KB en 7 archivos. Copie la carpeta PSWindowsUpdate a C:\Program Files\WindowsPowerShell\Modules en el servidor y quedará disponible para todos los usuarios. Recuerde, eso sí, que copiado así Update-Module no lo actualizará: repita la descarga cuando salga una versión nueva.
Escenarios de ejemplo con módulos de PowerShell
1. Preparar el equipo de un administrador de Microsoft 365
$modulos = 'Microsoft.Graph', 'ExchangeOnlineManagement', 'MicrosoftTeams', 'Microsoft.Online.SharePoint.PowerShell'
foreach ($m in $modulos) {
if (-not (Get-Module -ListAvailable -Name $m)) {
Install-Module -Name $m -Scope CurrentUser -Repository PSGallery
}
}
De este modo, solo instala lo que falta. Microsoft.Graph declaró 39 dependencias en la Galería, así que es el que más tarda.
2. Encontrar copias duplicadas en un equipo
Get-Module -ListAvailable |
Group-Object -Property Name |
Where-Object Count -gt 1 |
ForEach-Object {
[pscustomobject]@{
Modulo = $_.Name
Copias = $_.Count
Versiones = ($_.Group.Version -join ', ')
}
} | Format-Table -AutoSize
En el equipo de prueba salió ExchangeOnlineManagement con tres copias en las dos consolas: la 3.7.2, la 3.8.0 y la 3.9.2 en la 5.1, y la 3.10.1 junto a dos copias de la 3.9.2 en la 7. Ninguna se había borrado al actualizar.
3. Actualizar todo y dejar solo la última versión
foreach ($modulo in Get-InstalledModule) {
Update-Module -Name $modulo.Name -ErrorAction Continue
Get-InstalledModule -Name $modulo.Name -AllVersions |
Sort-Object -Property { [version]($_.Version -replace '-.*$') } -Descending |
Select-Object -Skip 1 |
ForEach-Object { Uninstall-Module -Name $_.Name -RequiredVersion $_.Version -ErrorAction Continue }
}
Primero, ejecútelo en una consola recién abierta, sin módulos cargados. Con Microsoft.Graph, algunas desinstalaciones pueden fallar porque un submódulo viejo es dependencia de otro: vuelva a ejecutarlo y terminará de limpiar. Por último, para hacerlo cada mes sin acordarse, prográmelo como una tarea.
4. Llevar un módulo de PowerShell a un servidor sin internet
New-Item -ItemType Directory -Path 'C:\Temp\Modulos' -Force | Out-Null
Save-Module -Name PSWindowsUpdate -Path 'C:\Temp\Modulos' -Repository PSGallery
$sesion = New-PSSession -ComputerName SRV-01
Copy-Item -Path 'C:\Temp\Modulos\PSWindowsUpdate' -Destination 'C:\Program Files\WindowsPowerShell\Modules' -ToSession $sesion -Recurse
Remove-PSSession $sesion
La copia viaja por la sesión remota, así que el servidor necesita tener habilitado PowerShell remoto y su usuario, permisos de administrador en él.
5. Encontrar los scripts que todavía usan AzureAD o MSOnline
Get-ChildItem -Path 'C:\Scripts' -Filter *.ps1 -Recurse |
Select-String -Pattern 'Connect-AzureAD', 'Connect-MsolService', 'AzureAD', 'MSOnline' -SimpleMatch |
Select-Object Path, LineNumber, Line
Cada línea que aparezca es un script que fallará en un equipo nuevo con «No match was found».
6. Exigir una versión mínima en un script compartido
#Requires -Modules @{ ModuleName = 'ExchangeOnlineManagement'; ModuleVersion = '3.0.0' }
Connect-ExchangeOnline
Si alguien lo ejecuta con una versión antigua, el script se detiene antes de hacer nada, con un mensaje que dice qué módulo falta.
Recomendaciones para administrar módulos de PowerShell
- En Windows PowerShell 5.1, actualice PowerShellGet antes de cualquier otra cosa. La 1.0.0.1 de fábrica no tiene soporte y no llega a la Galería.
- Prefiera PowerShell 7 y PSResourceGet para instalar: en nuestras pruebas fue varias veces más rápido.
- Instale con
-Scope CurrentUseren su equipo y conAllUserssolo en servidores o para tareas que se ejecutan como SYSTEM. - Limpie las versiones viejas después de actualizar:
Update-Moduleno las borra. - Antes de culpar a la Galería, busque con comodín y compruebe si lo que busca es un script, una característica de Windows o un módulo retirado.
- No mezcle vías de instalación: un módulo instalado con
Install-Modulese actualiza conUpdate-Module; uno instalado conInstall-PSResource, conUpdate-PSResource; uno copiado a mano, a mano. - Fije versiones en los scripts que comparte con
#Requires -Modules. - Revise qué publica cada autor antes de instalar algo de la Galería en un equipo de la empresa.
Preguntas frecuentes
¿Uso Install-Module o Install-PSResource?
Microsoft recomienda PSResourceGet, que es Install-PSResource, y viene incluido desde PowerShell 7.4. Install-Module sigue funcionando y es lo que verá en casi toda la documentación de los módulos de Microsoft. Los dos instalan en las mismas carpetas, pero no llevan el mismo registro. Medimos que Get-InstalledPSResource sí veía un módulo instalado con Install-Module, y que Get-InstalledModule no veía uno instalado con Install-PSResource. Elija una herramienta y use siempre la misma para instalar, actualizar y desinstalar.
Instalé un módulo en PowerShell 7 y no aparece en Windows PowerShell 5.1. ¿Por qué?
Porque cada consola tiene su carpeta de usuario: Documentos\PowerShell\Modules para la 7 y Documentos\WindowsPowerShell\Modules para la 5.1. La 7 lee las carpetas de la 5.1, pero la 5.1 no lee las de la 7. Si necesita el módulo en las dos, instálelo en las dos o para todos los usuarios.
¿Tengo que usar Import-Module cada vez?
No. PowerShell carga el módulo solo la primera vez que usa uno de sus comandos, siempre que esté en una carpeta de PSModulePath. Import-Module sirve para elegir versión o para cargar un módulo de otra ruta.
¿Cómo veo qué versión de un módulo estoy usando?
Con (Get-Module -Name ImportExcel).Version si ya está cargado, o con Get-Module -ListAvailable -Name ImportExcel para ver todas las que hay en el equipo.
¿Es segura la Galería de PowerShell?
Es el repositorio oficial, pero no todo lo publica Microsoft: según su documentación, unos paquetes son de Microsoft y otros de la comunidad, y para publicar basta con registrar una cuenta personal, de trabajo o educativa. Instale módulos de autores reconocibles, mire la fecha de la última versión y el número de descargas, y en los servidores deje la confirmación de instalación activada.
Módulos de PowerShell en la empresa
Instalar un módulo es fácil. Lo difícil, en cambio, es que veinte equipos tengan la misma versión, que los scripts no se rompan al actualizar y que nadie arrastre copias de AzureAD tres años después de su retirada. En KHARONTE resolvemos este trabajo desde nuestra mesa de ayuda TI, como parte de los servicios administrados de TI que prestamos a las empresas: mantenemos los equipos de administración, las tareas programadas y los scripts que dependen de estos módulos. Si quiere conocer el resto de nuestros servicios de TI para empresas, escríbanos.




