重新启用导入模块 Psreadline 警告

Re enable Import Module Psreadline warning

这个警告在 Visual Code 应用程序的终端中不断弹出

Warning: PowerShell detected that you might be using a screen reader and has
         disabled PSReadLine for compatibility purposes.
         If you want to re-enable it, run 'Import-Module PSReadLine'.

即使我通过 regedit 将值更改为 0,警告仍然显示。

您的症状的含义是:

  • Windows 处于屏幕-reader 模式(针对视障人士的 Windows 辅助功能) PowerShell 会话开始的时间。

  • 您正在使用 常规 PowerShell 会话,在控制台 window / Windows终端或在Visual Studio代码的集成终端中。

    • 相比之下,如果您使用 Visual Studio 代码 PowerShell extension, which enables a much richer PowerShell code-authoring experience, the problem doesn't occur, because the sessions provided by the extension in the so-called do not perform this check (as of version 2021.2.2), and therefore do load PSReadLine(提供丰富的命令行编辑体验的模块)并且不发出一个警告。目前尚不清楚这种无条件覆盖是设计使然还是疏忽。

    • 而您可以按照错误消息中的建议添加
      Import-Module PSReadLine 到您的 $PROFILE 文件,这样做会重新启用 PSReadLine 以获得丰富的命令行编辑体验,但是 您仍然会在启动时看到警告 ,因为它是由 PowerShell 加载 $PROFILE 文件之前发出的。也就是说,如果在您的系统上通过设计启用了屏幕-reader 模式,那么这是正确的解决方案。


如果通过注册表永久(意外)打开此模式,您可以按如下方式关闭它:

Set-ItemProperty 'registry::HKEY_CURRENT_USER\Control Panel\Accessibility\Blind Access' On 0

:

  • 此更改需要注销或重新启动才能生效。
  • 查询持久化模式,使用:
Get-ItemPropertyValue 'registry::HKEY_CURRENT_USER\Control Panel\Accessibility\Blind Access' On

如果此模式被意外打开 in-OS-session -因为它不会再次关闭模式或在能够这样做之前已经崩溃,您可以临时编译 C# 代码以关闭模式(感激地改编自 this GitHub comment)以便 未来 同一 OS 用户会话中的 PowerShell 会话不再看到警告:

(Add-Type -PassThru -Name ScreenReaderUtil -Namespace WinApiHelper -MemberDefinition @'
  const int SPIF_SENDCHANGE = 0x0002;
  const int SPI_SETSCREENREADER = 0x0047;

  [DllImport("user32", SetLastError = true, CharSet = CharSet.Unicode)]
  private static extern bool SystemParametersInfo(uint uiAction, uint uiParam, IntPtr pvParam, uint fWinIni);

  public static void EnableScreenReader(bool enable)
  {
    var ok = SystemParametersInfo(SPI_SETSCREENREADER, enable ? 1u : 0u, IntPtr.Zero, SPIF_SENDCHANGE);
    if (!ok)
    {
      throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
    }
  }
'@)::EnableScreenReader($false)