Módulos de PowerShell: instalar, actualizar y «No match was found»

Módulos de PowerShell: estanterías rojas de un almacén con gavetas azules rotuladas P53_3, P53_4 y P53_5, como varias versiones del mismo módulo guardadas una al lado de la otra

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óduloQué contieneEjemplo
Módulo de scriptUn archivo .psm1 con funciones de PowerShellImportExcel
Módulo binarioUna DLL compilada en .NETPSWindowsUpdate
Módulo de manifiestoUn .psd1 que agrupa otros módulos o archivosMicrosoft.Graph, que reúne decenas de submódulos
Módulo del sistemaViene con Windows o con PowerShellMicrosoft.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.

TareaMóduloVersión en la Galería (28-10-2026)Guía relacionada
Usuarios, licencias y grupos de Microsoft 365Microsoft.Graph2.41.2Microsoft 365 PowerShell
Buzones y correoExchangeOnlineManagement3.10.1Exchange Online PowerShell
Sitios de SharePointMicrosoft.Online.SharePoint.PowerShell16.0.27709.12000SharePoint Online PowerShell
Equipos y directivas de TeamsMicrosoftTeams8.0.0Microsoft Teams PowerShell
Recursos de AzureAz16.4.0No aplica
Actualizaciones de WindowsPSWindowsUpdate2.2.1.5No aplica
Leer y crear archivos de ExcelImportExcel7.8.10No aplica
Administrar SQL Serverdbatools2.9.1No aplica
Probar scriptsPester6.2.0No 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-Help y Get-Command -Module funcionan 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.

ÁmbitoWindows PowerShell 5.1PowerShell 7
Solo su usuario (CurrentUser)Documentos\WindowsPowerShell\ModulesDocumentos\PowerShell\Modules
Todos los usuarios (AllUsers)C:\Program Files\WindowsPowerShell\ModulesC:\Program Files\PowerShell\Modules
Los que trae la propia consolaC:\Windows\System32\WindowsPowerShell\v1.0\ModulesLa 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.

HerramientaComandosQué versión trae Windows o PowerShellEstado
PowerShellGet 1.0.0.1 con PackageManagement 1.0.0.1Install-Module, Find-ModuleLa que trae Windows PowerShell 5.1Sin soporte de Microsoft
PowerShellGet 2.2.5 con PackageManagement 1.4.8.1Install-Module, Update-ModuleIncluida en PowerShell 7Versión vigente
Microsoft.PowerShell.PSResourceGet 1.2.0Install-PSResource, Update-PSResourceIncluida desde PowerShell 7.4La 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 ImportExcelPowerShellGet en 5.1PowerShellGet en 7PSResourceGet en 7
Descargar a una carpeta (Save-Module / Save-PSResource)17,1 s22,3 s3,3 s
Instalar la versión 7.8.6 (Install-Module / Install-PSResource)79,4 s39,6 s6,2 s
Actualizar a la 7.8.10 (Update-Module / Update-PSResource)17,1 s29,4 s8,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.

ÁmbitoQuién lo veNecesita administradorCuándo usarlo
CurrentUserSolo su cuentaNoSu equipo de trabajo
AllUsersTodas las cuentas y las tareas programadas que se ejecutan como SYSTEMSí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 ImportExcel7.8.10
Get-InstalledModule ImportExcel -AllVersions7.8.10 y 7.8.6
Get-Module -ListAvailable ImportExcel7.8.10 y 7.8.6
Versión que carga Import-Module ImportExcel7.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 buscadoPor qué no lo encuentraQué hacer
AzureAD, AzureADPreview, MSOnlineMicrosoft los retiró y ya no aparecen en la GaleríaPasar a Microsoft.Graph
ActiveDirectory, GroupPolicyNo viven en la Galería: son parte de las herramientas RSAT de WindowsInstalar la característica de Windows
ExchangeOnline, Microsoft-GraphEl nombre está mal escritoBuscar con comodín: Find-Module 'ExchangeOnline*'
Get-WindowsAutoPilotInfoEs un script, no un móduloInstall-Script en lugar de Install-Module
Cualquiera, con PowerShellGet 1.0.0.1La versión de fábrica de la 5.1 ya no funciona con la GaleríaActualizar 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:

  1. 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.
  2. Compruebe que la Galería está registrada con Get-PSRepository. Si no aparece PSGallery, recupérela con Register-PSRepository -Default.
  3. Revise el protocolo. La Galería exige TLS 1.2. En la 5.1, forzando TLS 1.0, Invoke-WebRequest contra la Galería falló con No se puede crear un canal seguro SSL/TLS. Por suerte, PowerShellGet 2.2.5 se defiende solo: la variable de protocolo valía SystemDefault al abrir la consola y Tls12 después de su primera búsqueda.
  4. 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

MensajeQué significaSolución
Administrator rights are required to install modules in ...Pidió -Scope AllUsers sin elevarUse -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íaInstá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 PSModulePathInstálelo primero
The version 'X' of module 'Y' is currently in use.Está cargado en alguna consolaCierre las consolas y desinstale desde una nueva
No match was found for the specified search criteria and module names 'X'. al desinstalarUninstall-Module no lo instalóBorre su carpeta a mano
No se puede ejecutar el script ... porque faltan los siguientes módulosEl script tiene #Requires -Modules y el módulo falta o es más antiguoInstale o actualice el módulo que nombra
La ejecución de scripts está deshabilitadaDirectiva de ejecuciónVea 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 ImportExcel cargó la 7.8.10, la más reciente.
  • Import-Module ImportExcel -RequiredVersion 7.8.6 cargó 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éPowerShellGetPSResourceGet
Buscar en la GaleríaFind-ModuleFind-PSResource
InstalarInstall-ModuleInstall-PSResource
ActualizarUpdate-ModuleUpdate-PSResource
DesinstalarUninstall-ModuleUninstall-PSResource
Ver lo instaladoGet-InstalledModuleGet-InstalledPSResource
Descargar sin instalarSave-ModuleSave-PSResource
Ver repositoriosGet-PSRepositoryGet-PSResourceRepository
Cambiar un repositorioSet-PSRepositorySet-PSResourceRepository
Añadir un repositorioRegister-PSRepositoryRegister-PSResourceRepository
Instalar un scriptInstall-ScriptInstall-PSResource

Y los comandos del propio PowerShell, que funcionan con cualquier módulo, venga de donde venga:

ComandoQué hace
Get-ModuleMuestra los módulos cargados en la sesión
Get-Module -ListAvailableMuestra todos los que hay en las carpetas de PSModulePath
Import-ModuleCarga un módulo; con -RequiredVersion, una versión concreta
Remove-ModuleLo descarga de la sesión, sin desinstalarlo
Get-Command -Module XLista los comandos de un módulo
(Get-Module X).VersionDice 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

  1. 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.
  2. Prefiera PowerShell 7 y PSResourceGet para instalar: en nuestras pruebas fue varias veces más rápido.
  3. Instale con -Scope CurrentUser en su equipo y con AllUsers solo en servidores o para tareas que se ejecutan como SYSTEM.
  4. Limpie las versiones viejas después de actualizar: Update-Module no las borra.
  5. 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.
  6. No mezcle vías de instalación: un módulo instalado con Install-Module se actualiza con Update-Module; uno instalado con Install-PSResource, con Update-PSResource; uno copiado a mano, a mano.
  7. Fije versiones en los scripts que comparte con #Requires -Modules.
  8. 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.

Hablemos de la TI de su empresa

Cuéntenos qué necesita su operación y le enviamos una propuesta por escrito. Cada línea del portafolio se contrata por separado.

Compartir este artículo

Últimas entradas

Escríbanos ahora