>我有一个简单的自动热键脚本
!+l:: RunWait, PowerShell -NoExit -C "Import-Module D:projectschangescreensaverchangescreensaver.psm1; Set-ScreenSaverTimeout 1;"
但它不会让我加载我的 ps 配置文件或执行导入模块,并给我一个执行策略错误:
Import-Module : File D:projectschangescreensaverchangescreensaver.psm1 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.
在我的终端上,Get-ExecutionPolicy -List
返回
C:Userssomeone>Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine RemoteSigned
但在我的脚本中,返回
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine Undefined
我可以-ExecutionPolicy Bypass
传递它,但我仍然想了解:为什么从 AHK 调用 PS 时我的执行策略值不同?
您找到了问题的根源 - 您的 AHK 是 32 位的,因此运行 32 位 PowerShell 可执行文件,而您的终端(控制台窗口(运行 64 位可执行文件 - 但让我添加一些背景信息。
在Windows PowerShell中(与PowerShellCore不同(,执行策略存储在注册表中,即:
-
LocalMachine
范围:-
HKEY_LOCAL_MACHINESOFTWAREMicrosoftPowerShell1ShellIdsMicrosoft.PowerShell
,值ExecutionPolicy
-
-
CurrentUser
范围:-
HKEY_CURRENT_USERSOFTWAREMicrosoftPowerShell1ShellIdsMicrosoft.PowerShell
,价值ExecutionPolicy
-
虽然 32 位和 64 位应用程序共享相同的HKEY_CURRENT_USER
配置单元,但它们具有不同的HKEY_LOCAL_MACHINESoftware
子树。
因此,只有 LocalMachine
作用域具有 32 位和 64 位可执行文件的单独执行策略值。
换句话说:如果你的执行策略是在用户级别(-Scope CurrentUser
(设置的,则不会出现问题。
原来我的终端运行的是 64 位 powershell,而 AHK 使用的是 32 位,通过运行发现:
[Environment]::Is64BitProcess
基于这篇文章。