首页 > 解决方案 > 为什么删除 powershell.exe -executionpolicy unrestricted 突然起作用但以前没有

问题描述

我有一个调用 python 脚本的批处理文件 run.bat(如果它是 ps1 而不是 py 脚本,则同样的问题)

run.bat 的内容

powershell.exe -executionpolicy unrestricted
powershell python .\aTest.py

直到今天批处理文件没有调用 python 脚本,这一直运行良好。命令窗口显示以下消息:“尝试新的跨平台 PowerShell https://aka/ms/pscore6”

我从网上发现我可以使用 -nologon 禁止显示此消息,但除了删除该消息之外没有其他帮助。我删除了以下行 powershell.exe -executionpolicy unrestricted 并且脚本有效。从上次成功到今天,没有用户权限更改或对系统进行任何更改。

为什么会发生这种情况让我感到困惑,最初添加了 -executionPolicy,因为没有它,脚本就无法运行。现在情况正好相反,我怎样才能弄清楚为什么会发生这种情况?是什么原因造成的?如果用户是本地管理员组,是否有额外的 PS 标志有什么区别?

系统是 Windows 10 并且有一个本地管理员用户。

标签: powershellbatch-filepsexecutionpolicy

解决方案


powershell.exe -executionpolicy unrestricted

  • 这将进入一个交互式PowerShell 会话,该会话需要用户以交互方式提交exit才能退出会话,并且只有这样批处理文件才能继续执行。

  • -executionpolicy unrestricted仅适用会话(进程)。

  • 由于既没有使用 the-File也没有使用-Command参数(后者可能是隐含的,仅通过传递命令),PowerShell 发出一个“徽标”,即版权消息

    Windows PowerShell
    Copyright (C) Microsoft Corporation. All rights reserved.
    
    • 最新版本的 Windows PowerShell会在此消息中附加一条消息,宣传跨平台按需安装后续版本PowerShell (Core) v6+,以便您看到以下内容:

      Windows PowerShell
      Copyright (C) Microsoft Corporation. All rights reserved.
      
      Try the new cross-platform PowerShell https://aka.ms/pscore6
      
    • 用于-NoLogo抑制此输出;但是,如上所述,如果您通过将脚本文件路径 ( ) 传递到( ) 或(可能在位置上)将命令传递到( ) 来传递代码以作为调用的一部分执行,则这不是必需的。.ps1-File-f-Command-c

powershell python .\aTest.py

一般来说,执行 Python 脚本不需要涉及 PowerShell - 直接python .\aTest.py从批处理文件中调用就可以了。

只有当对 Python 脚本的调用依赖于通过 PowerShell 的配置文件(特别是通过当前用户的文件)执行的初始化$PROFILE时,才需要通过 PowerShell 进行调用。

  • 顺便说一句:如果您想禁止加载任何配置文件,请使用-NoProfile CLI选项,这通常是正确的做法,以确保可预测的执行环境并避免不必要的处理。

如果确实需要通过 PowerShell 调用,则有效执行策略不适用于调用Python脚本 - 它仅适用于PowerShell脚本 ( );如果配置文件碰巧调用了 PowerShell 脚本,请使用以下命令:*.ps1

powershell.exe -ExecutionPolicy Bypass -Command python .\aTest.py

注意:Bypass绕过有关脚本执行的所有.ps1检查,而在执行从 web下载的脚本之前Restricted仍会提示

注意:在Windows PowerShell CLI中,明确使用-Command( -c) 参数名称不是绝对必要的;但是,PowerShell (Core) 6+ CLI 现在确实需要它。powershell.exepwsh.exe


推荐阅读