为啥删除 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.exe
,Windows 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 突然起作用但以前没有的主要内容,如果未能解决你的问题,请参考以下文章
尝试下载 EXE 文件后,PowerShell (x64) 停止工作 (Windows 7)