大多数 powershell 命令不起作用

大多数 powershell 命令不起作用

C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\ModulesTLDR:我的主用户在查找 cmdlet 时不会查看文件夹。它只会查看C:\Users\myMainUser\Documents\WindowsPowerShell\Modules。因此,我要么必须执行 Import-Module -Name Microsoft.PowerShell.Management等等,要么将所有模块复制到C:\Users\myMainUser\Documents\WindowsPowerShell\Modules。创建一个临时用户并重复我在主用户​​(再次,全新的机器)上执行的所有相同步骤,它可以正常运行。

主要文章:

突然我的 powershell 坏了。诸如Write-Host或之类的命令Get-ChildItems不起作用:

PS C:\Windows\System32\WindowsPowerShell\v1.0> write-host 'test'
write-host : The term 'write-host' 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.
At line:1 char:1
+ write-host 'test'
+ ~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (write-host:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

我进行了一轮故障排除,卸载了一些最近安装或更新的软件,它似乎又开始工作了,但几个小时后它又开始出现同样的问题。有什么想法可以排除故障吗?

更新:进一步排除故障。(Get-Command -type cmdlet Write-Host).ModuleName在健康的计算机上运行,​​得到在坏的计算机上Microsoft.PowerShell.Utility 运行Get-Module "Microsoft.PowerShell.Utility"- 无输出,意味着模块未加载。因为在健康的计算机上它确实显示了该模块的一些输出。为什么不导入这个模块?如果我说Import-Module Microsoft.PowerShell.Utility在坏的计算机上,Write-Host它会再次开始工作。为什么它不像往常一样自动加载?

更新2:正如评论中所要求的,输出$PSVersionTable是:

Name                           Value
----                           -----
PSVersion                      5.1.18362.1171
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.18362.1171
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

基本上,这解释了整个问题:

PS C:\Users\myUser> Write-Host 'hello'
Write-Host : The term 'Write-Host' 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.
At line:1 char:1
+ Write-Host 'hello'
+ ~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Write-Host:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS C:\Users\myUser> Import-Module Microsoft.PowerShell.Utility
PS C:\Users\myUser> Write-Host 'hello'
hello
PS C:\Users\myUser>

今天收到了一台新机器,遇到了完全相同的问题。基本上,发生了什么:OldMachine:基本的 powershell 5.1 命令停止工作。故障排除显示几乎所有模块都不会自动加载,所以我仍然可以手动加载它们。但不是全部 - 有些具有非常复杂的依赖关系。

  • 检查了所有环境变量——它们都正常。
  • Windows 是否恢复了 - 没有帮助。
  • 创建了一个新的本地用户,一切在新用户下运行。

我无法解决这个问题,所以我买了一台替换电脑。全新的。开始设置,只做了以下操作:

  • 已安装 VS Code
  • 在 VS Code 中打开 Powershell 扩展
  • 它提示程序包管理器需要更新,否则将无法正常工作
  • 要求我安装 NuGet 以获取包管理器
  • 此后 PowerShell 5.1 再次停止工作。
  • 在安装 Git 的某个地方

完全相同的症状:模块无法自动加载,powershell 的新实例会出现这种情况:

PS C:\WINDOWS\system32> Write-Host
Write-Host : The term 'Write-Host' 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.
At line:1 char:1
+ Write-Host
+ ~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Write-Host:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
 

所以我认为这是在我安装这个更新的包管理器时发生的。有什么想法吗?

更新:进行了更多故障排除。创建本地用户并重复所有步骤:

  • 创建本地用户
  • 已安装 VS Code
  • 在 VS Code 中安装 Powershell 扩展
  • 它要求更新 PackageManagement
  • 提示需要 NuGet 来更新 PackageManagement,已安装
  • 安装 Git

一切正常。我能检测到的两个用户之间的唯一区别是,我的测试用户有一个文件夹“C:\Users\testuser\AppData\Local\PackageManagement\ProviderAssemblies”,其中安装了 nuget。我的主要用户没有这个文件夹。我怎样才能不从 powershell 安装它? Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force在 powershell 中几乎任何东西都不起作用,当我尝试Import-Module PackageManagement这样做时,它会抱怨它不知道Join-Path等等……

更新 2:我确实深入研究了这个问题,似乎导入了 PackageManagement 并找到了以下文件夹:“C:\Users\testuser\Documents\WindowsPowerShell\Modules\PackageManagement\1.4.7”,其中有“coreclr”和“fullclr”文件夹,而我的主用户中缺少这两个文件夹。复制它们有助于安装 PackageManagement。但问题仍然没有解决。

更新 3:因此,当我启动 PowerShell 的新实例并输入时Write-Host,我得到以下信息:

PS C:\WINDOWS\system32> Write-Host
Write-Host : The term 'Write-Host' 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.
At line:1 char:1
+ Write-Host
+ ~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Write-Host:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
 

这很奇怪,因为包含此 cmdlet 的模块位于C:\Windows\System32\WindowsPowerShell\v1.0\Modules并且应该自动加载。但是,如果我将子文件夹复制Microsoft.PowerShell.Utility到搜索模块的其他文件夹中:C:\Users\myMainUser\Documents\WindowsPowerShell\Modules- 一切都开始正常工作。那么,有什么特别之处C:\Windows\System32\WindowsPowerShell\v1.0\Modules?它列在$ENV:PSModulePath

PS C:\WINDOWS\system32> $ENV:PSModulePath
C:\Users\myMainUser\Documents\WindowsPowerShell\Modules;C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\Window

答案1

这为我修复了这个问题:

(Get-Module -ListAvailable).Name | %{Import-Module -Name $_ -Force}
[Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12
Install-Module -Name PackageManagement -Force -RequiredVersion 1.4.6 -Scope AllUsers -AllowClobber -Verbose

然后,如果最后一个命令没有安装 NuGet,请执行以下操作:

Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force

相关内容