从autohotkey运行Powershell脚本时执行策略错误

时间:2019-06-22 06:23:51

标签: powershell autohotkey executionpolicy

我有一个简单的自动热键脚本

!+l:: RunWait, PowerShell -NoExit -C "Import-Module D:\projects\changescreensaver\changescreensaver.psm1; Set-ScreenSaverTimeout 1;"

但这不会让我加载我的ps配置文件或执行导入模块,并给我执行策略错误:

Import-Module : File D:\projects\changescreensaver\changescreensaver.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:\Users\someone>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时,我的ExecutionPolicy值为何不同?

2 个答案:

答案 0 :(得分:4)

You found the source of the problem-您的AHK为32位,因此运行32位PowerShell可执行文件,而您的终端(控制台窗口)运行64位可执行文件-但让我添加一些背景信息。

Windows PowerShell 中(不同于PowerShell Core ),执行策略存储在注册表 中,即在:

  • LocalMachine范围:

    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell,值ExecutionPolicy
  • CurrentUser范围:

    • HKEY_CURRENT_USER\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell,值ExecutionPolicy

32位和64位应用程序共享相同的HKEY_CURRENT_USER配置单元,但它们具有不同的HKEY_LOCAL_MACHINE\Software子树

因此,只有LocalMachine范围的32位和64位可执行文件具有单独的执行策略值。

换句话说:如果您的执行策略是在 user 级别(-Scope CurrentUser)设置的,则不会出现此问题。

答案 1 :(得分:2)

结果证明我的终端运行的是64位Powershell,而AHK使用的是32位,通过运行发现:

[Environment]::Is64BitProcess

基于this post