Windows 10: Problemas (comandos não disponíveis) com o Powershell 7 + PSWindowsUpdate

Oct 05 2020

estabelecer:

  • atualizações do windows 10 2004 para as últimas atualizações estáveis
  • powershell 7.0.3
  • PSWindowsUpdate 2.2.0.2

TLDR: Estou executando a configuração acima e não consigo executar os comandos disponíveis em PSWindowsUpdate até executar "Get-Command -module PSWindowsUpdate".


Acho que é melhor explicado com um exemplo.

> Install-WindowsUpdate

Install-WindowsUpdate: The term 'Install-WindowsUpdate' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

> Get-Command -module PSWindowsUpdate

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           Clear-WUJob                                        2.2.0.2    PSWindowsUpdate
Alias           Download-WindowsUpdate                             2.2.0.2    PSWindowsUpdate
Alias           Get-WUInstall                                      2.2.0.2    PSWindowsUpdate
Alias           Get-WUList                                         2.2.0.2    PSWindowsUpdate
Alias           Hide-WindowsUpdate                                 2.2.0.2    PSWindowsUpdate
Alias           Install-WindowsUpdate                              2.2.0.2    PSWindowsUpdate
--snip--

> Install-WindowsUpdate
> 

Instalei o módulo por meio de "Install-Module -Name PSWindowsUpdate -Force" e criei pastas / arquivos em $ HOME \ Documents \ PowerShell \ Modules \ PSWindowsUpdate.

Como um teste, eu:

  • mova a pasta "PSWindowsUpdate" de $ HOME \ Documents \ PowerShell \ Modules para C: \ Arquivos de programas \ PowerShell \ 7 \ Modules
  • reinicie o PC
  • execute novamente o comando "Install-WindowsUpdate" (mesmos problemas acima)
  • execute novamente o comando "Get-Command -module PSWindowsUpdate"
  • execute novamente o comando "Install-WindowsUpdate" e agora está disponível

Como outro teste, eu:

  • abrir uma sessão / janela do Powershell 5.x
  • instale o módulo PSWindowsUpdate através de "Install-Module -Name PSWindowsUpdate -Force"
  • feche a sessão / janela do Powershell 5.x
  • abrir outra sessão / janela do Powershell 5.x
  • execute novamente o comando "Install-WindowsUpdate" e sem problemas
  • reinicie o PC
  • execute novamente o comando "Install-WindowsUpdate" e ainda sem problemas

Respostas

1 user19702 Oct 05 2020 at 20:52

Apenas instalar o módulo no sistema não é suficiente, você deve carregar o módulo em sua sessão com Import-Module PSWindowsUpdate. Um recurso confuso aqui é que a especificação -Moduleem seu Get-Command -Module PSWindowsUpdatecomando, na verdade, é executada Import-Modulenos bastidores para verificar se há comandos dentro desse módulo. Por exemplo, você provavelmente pode replicar isso:

Get-Module AWSPowershell

# no output - module is not loaded

Get-Command -Module AWSPowershell

#  CommandType     Name                                               Version                   
#  -----------     ----                                               -------                  
#  Alias           Add-ALXBContactWithAddressBook                     3.3.590.0          
#  Alias           Add-ASInstances                                    3.3.590.0  
#  [etc]        

Get-Module AWSPowershell

#  ModuleType Version    Name                                     
#  ---------- -------    ----                              
#  Binary     3.3.590.0  awspowershell

Apenas instalar o módulo não é suficiente de acordo com a install-moduledocumentação: "Para evitar a execução de módulos que contêm código malicioso, os módulos instalados não são importados automaticamente após a instalação."

O Powershell tem uma variável de ambiente para definir sua preferência por isso $PSModuleAutoLoadingPreference:

  • Todos: os módulos são importados automaticamente na primeira utilização. Para importar um módulo, obtenha ou use qualquer comando no módulo. Por exemplo, use Get-Command.
  • ModuleQualified: os módulos são importados automaticamente apenas quando um usuário usa o nome qualificado do módulo de um comando no módulo. Por exemplo, se o usuário digitar MyModule \ MyCommand, o PowerShell importará o módulo MyModule.
  • Nenhum: a importação automática de módulos é desabilitada na sessão. Para importar um módulo, use o cmdlet Import-Module.

Para obter mais informações sobre a importação automática de módulos, consulte about_Modules .