[PowerShell] 修改执行策略解决 VSCode 虚拟环境报错“Activate.ps1 cannot...running...on this system.“

时间:2024-10-18 13:59:15

文章目录

  • ???? BUG
    • ???? VSCode提示的报错信息
  • ???? DEBUG
    • ???? 方案一(已执行):修改PowerShell的执行策略
      • ???? PowerShell的执行策略
      • ???? 三个命令的用途和效果
    • ???? 方案二(参考):将默认终端类型设置为命令提示符
      • ???? 方法 1:在系统设置中选择Windows控制台主机作为默认终端应用程序
      • ???? 方法 2:在Windows终端的设置中选择Windows控制台主机作为默认终端应用程序
      • ???? 方法 3:在Windows控制台主机的属性中更改默认终端应用程序


???? BUG

???? VSCode提示的报错信息

在VSCode中尝试激活python虚拟环境时遇到以下报错信息:

PS F:\test> & f:/test/.venv/Scripts/Activate.ps1
& : 无法加载文件 F:\test\.venv\Scripts\Activate.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.micro
soft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
所在位置 行:1 字符: 3
+ & f:/test/.venv/Scripts/Activate.ps1
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [],PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
PS F:\test>

类似问题参考:

& : File C:\Users\pc\Documents\python\venv\Scripts\Activate.ps1 cannot be loaded because running scripts is 
    disabled on this system. For more information, see about_Execution_Policies at 
    https:/go.microsoft.com/fwlink/?LinkID=135170.
    At line:1 char:3
    + & c:/Users/pc/Documents/python/venv/Scripts/Activate.ps1
    +   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : SecurityError: (:) [], PSSecurityException       
        + FullyQualifiedErrorId : UnauthorizedAccessenter code here

这个报错信息的意思是:尝试激活一个python虚拟环境,但是遇到了一个PowerShell的执行策略问题。

PowerShell默认禁止运行没有数字签名的脚本,而虚拟环境的激活脚本可能没有签名。
为了解决这个问题,可以使用下面介绍的方法中的任意一种,来修改PowerShell的执行策略,从而允许运行虚拟环境的激活脚本。

???? DEBUG

???? 方案一(已执行):修改PowerShell的执行策略

三种推荐的可选命令:

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted

最终执行记录(如图所示):

  • 以管理员身份运行PowerShell,输入Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned,然后输入y确认。
  • 重新启动VSCode,然后再次尝试激活虚拟环境,看看是否还有报错。
  • 如果还有报错,可以尝试方案二使用cmd或者git bash作为终端,而不是PowerShell,因为它们没有执行策略的限制。

在这里插入图片描述

???? PowerShell的执行策略

PowerShell是一种强大的命令行工具,它可以让我们用编程的方式来管理和自动化Windows系统的各种任务。
PowerShell也可以运行脚本,脚本是一种包含一系列PowerShell命令的文本文件,它可以让我们批量执行复杂的操作。
然而,PowerShell并不是随便就可以运行任何脚本的,它有一种安全机制,叫做执行策略(Execution Policy)。

执行策略是用来控制PowerShell是否可以运行脚本,以及脚本是否需要数字签名的。数字签名是一种用来验证脚本的来源和完整性的技术,它可以防止脚本被篡改或者伪造。

执行策略有以下几种级别:

  • Restricted:最严格的执行策略,禁止运行所有的脚本,只能运行交互式的命令。这是Windows客户端计算机的默认执行策略。
  • AllSigned:要求所有的脚本都必须有有效的数字签名,无论是本地的还是远程的,否则不能运行。
  • RemoteSigned:只对远程下载的脚本进行限制,要求它们必须有有效的数字签名,而对本地创建的脚本不进行限制,无论是否签名都可以运行。这是Windows服务器计算机的默认执行策略。
  • Unrestricted:对所有的脚本都不进行限制,但是对于远程下载的未签名脚本,会提示用户是否运行。
  • Bypass:最宽松的执行策略,不对任何脚本进行任何限制,无论是本地的还是远程的,无论是签名的还是未签名的,都可以运行。

???? 三个命令的用途和效果

这三个命令都是用来设置PowerShell的执行策略的,执行策略是一种安全机制,用于控制PowerShell是否可以运行脚本,以及脚本是否需要数字签名。

这三个命令的区别是:

  • Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force
    这个命令会将当前用户的执行策略设置为Bypass,表示不阻止任何操作,并且没有任何警告或提示。
    这意味着不对任何脚本进行任何限制,无论是本地的还是远程的,无论是签名的还是未签名的,都可以运行。 -Force 参数表示强制覆盖现有的执行策略,不需要用户确认。
    这是最不安全的执行策略,因为它可能会让你运行一些恶意的或者不可信的脚本。

  • Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
    这个命令会将当前用户的执行策略设置为RemoteSigned,表示要求受信任的发布者对从Internet下载的脚本和配置文件的数字签名,而在本地计算机上编写的脚本不需要数字签名。
    这意味着只对远程下载的脚本进行限制,要求它们必须有有效的数字签名,而对本地创建的脚本不进行限制,无论是否签名都可以运行。
    这是一个比较安全的执行策略,因为它可以防止你运行一些未经验证的远程脚本。

  • Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted
    这个命令会将当前用户的执行策略设置为Unrestricted,和上一个命令的区别是作用域不同,这个命令会影响当前计算机上的所有用户。
    这意味着对所有脚本都不进行限制,但是对于远程下载的未签名脚本,会提示用户是否运行。
    这是一个比较灵活的执行策略,因为它可以让用户自己决定是否运行某个脚本,但是也需要用户有一定的判断能力。
    这个执行策略的安全性取决于用户的判断能力。

综上所述,这三个命令的优劣取决于具体需求和场景,以及对安全性和便利性的权衡。关于哪个命令更好,这要根据具体需求和安全考虑来决定。

一般来说,Bypass 是最不安全的执行策略,因为它可以让任何脚本无条件运行,可能会导致恶意脚本的执行。
RemoteSigned 是一种比较适中的执行策略,因为它可以在一定程度上防止从不可信来源下载的脚本的执行,但是也不会限制本地编写的脚本的执行。这里建议使用Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned命令,因为它可以提供一个比较合理和安全的执行策略,既可以运行本地的脚本,又可以避免运行不可信的远程脚本。

当然,执行策略并不是限制用户操作的安全系统,而是一种帮助用户设置基本规则的安全功能,用户可以根据自己的判断和需要来更改执行策略。

在这里插入图片描述

???? 方案二(参考):将默认终端类型设置为命令提示符

Windows上将默认终端类型设置为命令提示符有几种方法可以实现,下面介绍其中三种常用的方法。

???? 方法 1:在系统设置中选择Windows控制台主机作为默认终端应用程序

这个方法是通过修改Windows的系统设置,来改变默认的终端应用程序,从而影响PowerShell的执行策略。

终端应用程序是一种可以让我们在命令行界面下与计算机交互的程序,例如Windows控制台主机()、Windows PowerShell、Windows终端等。
不同的终端应用程序可能有不同的执行策略,例如Windows控制台主机的执行策略是Bypass,而Windows PowerShell的执行策略是Restricted。

要使用这个方法,需要按以下的步骤操作:

  • 按Win键,然后输入设置,打开系统设置。
  • 选择隐私和安全 > 终端,在那里可以看到默认终端应用程序的选项。
  • 从下拉菜单中选择Windows控制台主机,这样就可以使用作为默认终端了。

优点是简单方便,不需要输入任何命令,只需要几次点击就可以完成。
缺点是可能会影响其他的终端应用程序的使用,例如Windows PowerShell或者Windows终端,因为它们的执行策略可能不同于Windows控制台主机的执行策略。

???? 方法 2:在Windows终端的设置中选择Windows控制台主机作为默认终端应用程序

这个方法是通过修改Windows终端的设置,来改变默认的终端应用程序,从而影响PowerShell的执行策略。

Windows终端是一种新的终端应用程序,它可以让我们在一个窗口中同时使用多个终端,例如Windows控制台主机、Windows PowerShell、PowerShell Core、Azure Cloud Shell等。
Windows终端也可以让我们自定义终端的外观和行为,例如字体、颜色、背景、快捷键等。

要使用这个方法,需要按以下的步骤操作:

  • 按Win键,然后输入wt,打开Windows终端。
  • 点击左上角的下拉菜单,选择设置。在设置窗口中,选择启动选项卡,然后在默认终端应用程序的下拉菜单中选择Windows控制台主机,这样也可以使用作为默认终端了。

优点是可以在Windows终端中方便地切换不同的终端应用程序,而不需要修改系统设置。
缺点是需要安装Windows终端,它不是Windows系统自带的,需要从Microsoft Store下载安装。

???? 方法 3:在Windows控制台主机的属性中更改默认终端应用程序

这个方法是通过修改Windows控制台主机的属性,来改变默认的终端应用程序,从而影响PowerShell的执行策略。

Windows控制台主机是一种最基本的终端应用程序,它可以让我们运行各种命令行工具,例如、等。
Windows控制台主机的属性可以让我们调整终端的外观和行为,例如窗口大小、缓冲区大小、字体大小、颜色等。

要使用这个方法,需要按以下的步骤操作:

  • 如果已经打开了一个的窗口,可以右键单击标题栏,然后选择属性。如果没有打开,可以按Win键,然后输入cmd,打开一个新的窗口,然后再右键单击标题栏,选择属性。
  • 在属性窗口中,选择终端选项卡,然后在默认终端应用程序的下拉菜单中选择Windows控制台主机,这样也可以使用作为默认终端了。

优点是可以针对每个终端窗口进行单独的设置,而不需要修改系统设置或者Windows终端的设置。
缺点是需要对每个终端窗口进行设置,而且设置可能不会保存,需要每次重新设置。