为啥删除 powershell.exe -executionpolicy unrestricted 突然起作用但以前没有

Posted

技术标签:

【中文标题】为啥删除 powershell.exe -executionpolicy unrestricted 突然起作用但以前没有【英文标题】:Why removing powershell.exe -executionpolicy unrestricted suddenly working but wasn't before为什么删除 powershell.exe -executionpolicy unrestricted 突然起作用但以前没有 【发布时间】:2021-11-25 06:29:55 【问题描述】:

我有一个调用 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 并且有一个本地管理员用户。

【问题讨论】:

【参考方案1】:

powershell.exe -executionpolicy unrestricted

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

-executionpolicy unrestricted应用于那个会话(进程)。

由于既没有使用-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) 传递给 @ 987654336@ (-f),或通过(可能在位置上)将命令传递给-Command (-c)。

powershell python .\aTest.py

一般来说,没有需要使用 PowerShell 来执行 Python 脚本 - 应该直接从批处理文件中调用 python .\aTest.py

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

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

如果您确实需要通过 PowerShell 调用,有效的execution policy 确实适用于调用 Python 脚本 - 它仅适用于 PowerShell em> 脚本 (*.ps1);如果 配置文件 碰巧调用了 PowerShell 脚本,请使用以下命令:

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

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

注意:对于powershell.exeWindows PowerShell CLI 不一定需要显式使用 -Command (-c) 参数名称;但是,pwsh.exe、PowerShell (Core) 6+ CLI 现在确实需要它。

【讨论】:

@ek777,请查看我的更新,但简而言之:版权消息(“徽标”)仅在您既不使用 -File 也不(可能在位置上应用)-Command 时出现 - 这就是如何它一直有效;新增的是 附加行 推广 PowerShell(核心); -NoLogo 可以抑制所有这些行。再次重申:您问题中的第一个 powershell 调用会进入 交互式会话,该会话会阻止批处理文件,直到用户键入 exit 来终止该会话(或者您提供string exit via stdin) - 这就是它一直的工作方式。这真的是意图吗? @ek777, re Bypass vs. Restricted: 简而言之:是的,但Bypass 更彻底 - 请参阅最后一个代码sn-p下方的“注意:”。

以上是关于为啥删除 powershell.exe -executionpolicy unrestricted 突然起作用但以前没有的主要内容,如果未能解决你的问题,请参考以下文章

powershell.exe 命令行变量

以编程方式获取 powershell.exe 的完整路径

尝试下载 EXE 文件后,PowerShell (x64) 停止工作 (Windows 7)

cmd.exe --> powershell.exe "-File" 和 "-Command" 在同一行

从 powershell.exe 将参数传递给脚本

从CMD管道到PowerShell