Windows双击.ps1没反应?PowerShell执行策略与注册表关联详解
1. 双击 .ps1 没反应问题到底出在哪很多人第一次接触 PowerShell 脚本时都会遇到同一个场景从网上或者同事那里拿到一个.ps1文件双击它然后……什么都没发生。没有窗口弹出没有报错没有提示就像双击了一个空气。这时候大部分人的第一反应是文件坏了或者电脑有问题但实际上这是 Windows 对.ps1文件的一种默认保护机制在起作用。先把这个事情说清楚.ps1是 PowerShell 脚本文件的扩展名本质上就是一段纯文本里面写的是一系列 PowerShell 命令。它跟.bat和.cmd最大的区别在于Windows 默认不把.ps1当作可执行文件来对待。你在资源管理器里双击.bat系统会调用cmd.exe去跑它但双击.ps1系统默认的动作是用记事本打开或者干脆没有任何关联动作。这就是为什么双击之后看起来毫无反应。那为什么 Windows 要这么设计原因不复杂。PowerShell 脚本的权限非常大可以操作注册表、修改系统服务、读写任意文件、发起网络请求。如果双击就能直接运行那恶意脚本的传播成本就太低了——用户从邮件附件里下载一个.ps1双击一下系统就被改了。所以微软在默认策略上做了两层限制第一层是文件关联层面.ps1不默认关联到 PowerShell 执行引擎第二层是执行策略层面PowerShell 有一个ExecutionPolicy的概念默认是Restricted意思是不允许运行任何脚本文件。这两层限制叠加在一起就造成了新手最常见的困惑我明明有 PowerShell为什么双击.ps1就是不动要解决这个问题核心思路就是两条路要么改文件关联让双击.ps1时自动调用 PowerShell 来执行要么改执行策略让 PowerShell 允许运行脚本。两条路可以单独走也可以一起走。但具体怎么选、怎么改、改完有什么风险这里面有不少细节值得展开说。这篇文章面向的是所有需要在 Windows 上运行.ps1脚本的人——不管你是刚入门的运维新手还是经常写自动化脚本的老手只要你在双击运行.ps1这件事上卡过壳下面的内容都能直接拿来用。我会从原理讲到实操从注册表改法讲到命令行方案再把常见的坑一个个拆开说清楚。2. 先搞清楚 PowerShell 执行策略这道门槛在动手改任何东西之前有一个概念必须先弄明白否则你改完了文件关联双击之后还是会弹出一个红色报错告诉你无法加载文件因为在此系统上禁止运行脚本。这个报错就是执行策略在拦你。2.1 ExecutionPolicy 的几种状态和实际含义PowerShell 的执行策略不是一个安全开关它更像是一个防误触开关。微软官方对它的定位说得很明确它不是安全边界不能阻止有心人绕过它。它的作用是防止用户无意中运行了不该运行的脚本。执行策略主要有以下几种取值策略值含义适用场景Restricted禁止运行任何脚本文件默认值最严格AllSigned只允许运行有数字签名的脚本企业环境RemoteSigned本地脚本可运行远程下载的脚本需签名推荐日常使用Unrestricted所有脚本都可运行不推荐风险高Bypass完全不检查什么都不拦临时执行用Undefined未设置继承上级作用域组策略管理场景大部分人卡住的原因是策略处于Restricted。你可以在 PowerShell 里运行Get-ExecutionPolicy来查看当前状态。如果返回Restricted那不管你怎么双击.ps1脚本都不会被执行。这里有一个很多人不知道的细节执行策略是有作用域的。你可以针对当前用户设置也可以针对整个机器设置还可以只针对当前这个 PowerShell 进程设置。作用域的优先级从高到低是Process当前进程 CurrentUser当前用户 LocalMachine本机所有用户。这意味着你可以在不改动系统全局设置的情况下只给当前用户放开权限。2.2 改执行策略的几种方式和各自的影响范围改执行策略最常用的命令是Set-ExecutionPolicy。具体怎么用取决于你想影响的范围# 只对当前用户生效推荐做法 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser # 对本机所有用户生效需要管理员权限 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine # 只对当前这个 PowerShell 窗口生效关掉就恢复 Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process我个人的建议是日常开发机用CurrentUser范围设成RemoteSigned。这个组合的好处是你自己写的本地脚本可以直接跑从网上下载的脚本如果没有签名就会被拦住给你一个二次确认的机会。RemoteSigned这个名字的意思就是远程来的要有签名本地的不受限制。为什么不推荐直接设成Unrestricted因为那样的话任何来源的脚本都会直接执行包括你从不明渠道下载的.ps1。虽然执行策略不是安全边界但多一道确认总比没有好。还有一个常见的误区有人改了执行策略之后发现还是不行原因是组策略Group Policy层面做了覆盖。在企业环境中IT 管理员可能通过组策略把执行策略锁死在Restricted这时候你用Set-ExecutionPolicy改会提示策略已被覆盖。遇到这种情况需要从组策略层面去调整普通用户权限下改不了。2.3 临时绕过执行策略的几种姿势有时候你只是临时想跑一个脚本不想改系统设置。这时候有几种方式可以绕过执行策略第一种是用-ExecutionPolicy Bypass参数启动 PowerShellpowershell.exe -ExecutionPolicy Bypass -File C:\scripts\test.ps1第二种是在命令行里用-Command参数直接执行脚本内容powershell.exe -ExecutionPolicy Bypass -Command C:\scripts\test.ps1第三种是在已经打开的 PowerShell 窗口里用点号或者符号来调用脚本# 在当前作用域执行 . C:\scripts\test.ps1 # 在新作用域执行 C:\scripts\test.ps1这两种调用方式的区别在于点号调用是在当前作用域执行脚本里定义的变量和函数在脚本结束后仍然存在调用是在子作用域执行脚本结束后变量和函数就没了。这个区别在调试脚本时很有用。注意-ExecutionPolicy Bypass参数只影响当前这次启动的 PowerShell 进程不会改变系统或用户的执行策略设置。关掉窗口就恢复原样。3. 改注册表让双击 .ps1 直接跑起来搞定了执行策略之后接下来就是文件关联的问题。Windows 的文件关联信息存在注册表里具体位置在HKEY_CLASSES_ROOT下面。要让双击.ps1时自动用 PowerShell 执行需要改两个地方一是.ps1这个扩展名对应的文件类型二是那个文件类型对应的打开命令。3.1 注册表里 .ps1 关联的完整结构先来看一下默认情况下.ps1在注册表里是怎么关联的。打开注册表编辑器regedit定位到HKEY_CLASSES_ROOT\.ps1你会看到它的默认值通常是Microsoft.PowerShellScript.1或者txtfile。这个值指向的是文件类型描述决定了双击时用哪个程序打开。然后去看HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell这个路径。默认情况下这里可能只有一个Open子键对应的命令是notepad.exe %1也就是用记事本打开。这就是为什么双击.ps1会弹出记事本的原因。要改成用 PowerShell 执行需要做两件事在HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell下面新建一个Run子键或者修改默认的Open子键在Run\Command子键里设置默认值为 PowerShell 的执行命令具体的命令格式是这样的powershell.exe -NoProfile -ExecutionPolicy Bypass -File %1这里每个参数都有讲究。-NoProfile表示不加载 PowerShell 配置文件这样可以加快启动速度也避免配置文件里的设置干扰脚本执行。-ExecutionPolicy Bypass是临时绕过执行策略确保脚本能跑起来。-File %1表示把双击的文件路径作为脚本文件传给 PowerShell。%1是注册表里的占位符代表用户双击的那个文件的完整路径。3.2 手动改注册表的完整步骤如果你习惯用图形界面操作可以按下面的步骤来按Win R输入regedit回车打开注册表编辑器导航到HKEY_CLASSES_ROOT\.ps1确认右侧默认值的数据如果默认值是Microsoft.PowerShellScript.1就导航到HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell在Shell下面新建一个项命名为Run在Run下面新建一个项命名为Command双击Command项的默认值把数值数据设为powershell.exe -NoProfile -ExecutionPolicy Bypass -File %1关闭注册表编辑器双击.ps1文件测试如果默认值不是Microsoft.PowerShellScript.1而是txtfile或者其他值那说明你的系统上.ps1被关联到了别的程序。这时候你需要先把.ps1的默认值改成Microsoft.PowerShellScript.1或者直接针对当前的文件类型去改 Shell 命令。3.3 用命令行一键完成关联修改手动点注册表容易出错而且步骤多。更高效的方式是用命令行来改。在管理员权限的 PowerShell 或 CMD 里执行下面的命令# 设置 .ps1 的文件类型 New-Item -Path Registry::HKEY_CLASSES_ROOT\.ps1 -Force | Out-Null Set-ItemProperty -Path Registry::HKEY_CLASSES_ROOT\.ps1 -Name (Default) -Value Microsoft.PowerShellScript.1 # 创建 Run 动作 New-Item -Path Registry::HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Run\Command -Force | Out-Null Set-ItemProperty -Path Registry::HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Run\Command -Name (Default) -Value powershell.exe -NoProfile -ExecutionPolicy Bypass -File %1 # 把 Run 设为默认动作 Set-ItemProperty -Path Registry::HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell -Name (Default) -Value Run这几条命令做的事情和手动操作完全一样但是速度快得多而且不容易点错。执行完之后双击.ps1文件就会直接调用 PowerShell 来运行了。如果你更习惯用 CMD 的reg命令对应的写法是这样的reg add HKCR\.ps1 /ve /d Microsoft.PowerShellScript.1 /f reg add HKCR\Microsoft.PowerShellScript.1\Shell\Run\Command /ve /d powershell.exe -NoProfile -ExecutionPolicy Bypass -File \%%1\ /f reg add HKCR\Microsoft.PowerShellScript.1\Shell /ve /d Run /f注意 CMD 里%1需要写成%%1因为%在批处理里是转义字符。3.4 改完之后双击闪退是怎么回事很多人改完注册表之后双击.ps1发现窗口一闪就没了。这不是没运行而是脚本运行完了窗口自动关闭了。因为 PowerShell 执行完脚本之后默认就退出如果脚本本身没有暂停或者等待输入的逻辑窗口就会瞬间消失。解决办法有几个第一种是在注册表的命令里加上-NoExit参数powershell.exe -NoProfile -ExecutionPolicy Bypass -NoExit -File %1-NoExit的意思是执行完脚本后不退出 PowerShell保持窗口打开。这样你就能看到脚本的输出结果了。第二种是在脚本末尾加一行Read-Host或者Pause让脚本自己停下来等用户按键。这种方式更灵活因为你可以控制哪些脚本需要暂停、哪些不需要。第三种是先用命令行方式测试脚本确认脚本本身没问题之后再改注册表。这样可以把脚本报错和窗口闪退两个问题分开排查。提示如果你加了-NoExit之后发现每次双击都留一个窗口关起来很烦那可以在脚本里根据情况决定是否暂停。比如用if ($Host.Name -eq ConsoleHost) { Read-Host 按回车键退出 }这样的逻辑只在控制台宿主里暂停。4. 不改注册表的替代方案右键菜单和发送到改注册表虽然直接但有些人不想动系统核心配置或者没有管理员权限。这种情况下有几个替代方案可以达到类似的效果。4.1 给右键菜单加一个用 PowerShell 运行选项这个方案的好处是不动.ps1的默认关联只是在右键菜单里增加一个额外的选项。这样你双击.ps1还是用记事本打开方便查看和编辑右键选择用 PowerShell 运行才会执行。具体做法是在注册表里添加一个shell项。路径是HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell在里面新建一个项名字随意比如RunWithPowerShell。然后在这个项下面新建Command子项默认值设为powershell.exe -NoProfile -ExecutionPolicy Bypass -File %1这样右键点击.ps1文件时菜单里就会多出一个RunWithPowerShell选项。你可以把项名改成中文比如用 PowerShell 运行菜单里显示的就是中文。用命令行操作的话New-Item -Path Registry::HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\RunWithPowerShell\Command -Force | Out-Null Set-ItemProperty -Path Registry::HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\RunWithPowerShell -Name (Default) -Value 用 PowerShell 运行 Set-ItemProperty -Path Registry::HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\RunWithPowerShell\Command -Name (Default) -Value powershell.exe -NoProfile -ExecutionPolicy Bypass -File %1这个方案我用了很长时间最大的好处是安全——你不会因为误双击一个恶意脚本就直接执行了。每次执行都需要主动右键选择多了一步确认但心里踏实。4.2 用发送到菜单实现快速执行Windows 的发送到菜单SendTo是另一个不改注册表的方案。你只需要在shell:sendto目录里放一个快捷方式指向 PowerShell并带上合适的参数。具体步骤按Win R输入shell:sendto回车打开发送到文件夹在里面新建一个快捷方式快捷方式的目标设为powershell.exe -NoProfile -ExecutionPolicy Bypass -File给快捷方式起个名字比如PowerShell 运行这样你右键点击.ps1文件在发送到菜单里就能看到PowerShell 运行选项。点击它就会用 PowerShell 执行这个脚本。这个方案的限制是发送到菜单里的快捷方式不能自动把文件路径作为参数传给 PowerShell。也就是说你点发送到之后PowerShell 会打开但不会自动加载你选中的脚本文件。要解决这个问题需要写一个小的批处理或者脚本作为中转。可以创建一个run-ps1.bat文件内容如下echo off powershell.exe -NoProfile -ExecutionPolicy Bypass -File %~1 pause然后把这个.bat文件的快捷方式放到shell:sendto目录里。这样右键发送到的时候%~1就会自动替换成你选中的.ps1文件路径。4.3 用批处理包装器实现双击执行如果你不想改注册表也不想用右键菜单还有一个更简单的办法写一个.bat文件作为包装器让用户双击这个.bat来执行.ps1。包装器的内容很简单echo off powershell.exe -NoProfile -ExecutionPolicy Bypass -File %~dp0\script.ps1 pause%~dp0表示批处理文件所在的目录这样不管你把这两个文件放到哪里都能正确找到同目录下的.ps1文件。pause让窗口在执行完后暂停方便查看输出。这个方案的优点是零配置、零风险不需要动注册表也不需要管理员权限。缺点是每个.ps1都要配一个.bat文件多了之后管理起来比较麻烦。适合脚本数量不多、偶尔用一次的场景。5. 那些年我踩过的 .ps1 运行坑上面讲的都是正常情况下的操作。但实际操作中你会遇到各种奇奇怪怪的问题。这一节我把这些年踩过的坑整理一下每个坑都给出排查思路和解决方案。5.1 中文乱码脚本里的中文全变成了问号这是最常见的问题之一。你写了一个包含中文输出的.ps1脚本双击运行之后发现所有中文都变成了乱码或者问号。原因通常是文件编码和 PowerShell 的默认编码不一致。PowerShell 5.1 默认使用系统 ANSI 编码简体中文系统上是 GBK来读取没有 BOM 的脚本文件。如果你用 UTF-8 保存脚本但没有加 BOMPowerShell 5.1 就会用 GBK 去解码 UTF-8 的内容结果就是乱码。PowerShell 7.x 默认使用 UTF-8这个问题就少很多。解决方案有几种第一种是把脚本文件保存为UTF-8 with BOM格式。用 VS Code 的话在右下角点击编码选择通过编码保存然后选UTF-8 with BOM。用记事本的话另存为的时候在编码选项里选UTF-8Windows 10 之后的记事本默认就是带 BOM 的 UTF-8。第二种是在脚本开头显式设置输出编码[Console]::OutputEncoding [System.Text.Encoding]::UTF8 $OutputEncoding [System.Text.Encoding]::UTF8第三种是升级到 PowerShell 7.x它对 UTF-8 的支持好很多默认就不需要 BOM。注意如果你在注册表的执行命令里加了-NoProfile那 PowerShell 的配置文件就不会加载。如果你之前在配置文件里设置了编码相关的选项加了-NoProfile之后那些设置就失效了。这时候要么去掉-NoProfile要么在脚本里自己设置编码。5.2 路径里有空格脚本找不到文件Windows 的路径里经常有空格比如C:\Program Files\My Scripts\test.ps1。如果你的注册表命令里没有给%1加引号PowerShell 就会把路径从空格处断开导致找不到文件。正确的写法是-File %1引号不能省。同样在脚本内部引用路径时也要注意加引号# 错误写法 Get-Content C:\Program Files\test.txt # 正确写法 Get-Content C:\Program Files\test.txt还有一个相关的坑如果脚本路径以\\开头的 UNC 路径网络共享某些情况下 PowerShell 的-File参数处理会有问题。这时候可以改用-Command参数powershell.exe -NoProfile -ExecutionPolicy Bypass -Command %15.3 执行策略被组策略锁死前面提到过企业环境里 IT 管理员可能通过组策略把执行策略锁死。这种情况下你用Set-ExecutionPolicy会看到这样的报错Set-ExecutionPolicy : 无法设置执行策略因为执行策略已在更具体的作用域中定义。或者计算机上的执行策略已由组策略覆盖。遇到这种情况有几个应对方式第一用-ExecutionPolicy Bypass参数启动 PowerShell。这个参数是进程级别的优先级高于组策略设置的机器级别策略。也就是说即使组策略把机器策略设成了Restricted你在启动 PowerShell 时加-ExecutionPolicy Bypass当前进程仍然可以运行脚本。第二检查组策略设置的位置。在gpedit.msc里路径是计算机配置 管理模板 Windows 组件 Windows PowerShell里面有一个打开脚本执行策略。如果这个策略被启用并设成了已禁用那执行策略就被锁死了。第三如果确实需要修改组策略需要域管理员权限。普通用户只能通过-ExecutionPolicy Bypass参数来临时绕过。5.4 双击运行和手动运行结果不一样有时候你会发现同一个脚本在 PowerShell 窗口里手动运行没问题但双击运行就报错。这种环境差异问题通常有以下几个原因第一个原因是工作目录不同。双击运行时PowerShell 的工作目录可能是C:\Windows\System32或者用户主目录而不是脚本所在的目录。如果脚本里用了相对路径就会找不到文件。解决方案是在脚本开头加上Set-Location $PSScriptRoot把工作目录切换到脚本所在目录。第二个原因是-NoProfile参数。如果你在注册表命令里加了-NoProfile那 PowerShell 启动时不会加载配置文件。如果你在配置文件里定义了一些函数或者变量脚本里又用到了它们双击运行就会报错。解决方案是去掉-NoProfile或者在脚本里自己定义需要的函数和变量。第三个原因是权限不同。双击运行时PowerShell 以当前用户权限运行。如果你在管理员权限的 PowerShell 窗口里测试脚本脚本可能依赖了管理员权限才能访问的资源。双击运行时权限不够就会报错。解决方案是在注册表命令里加上-Verb RunAs来请求提权或者用任务计划程序以最高权限运行。5.5 杀毒软件拦截脚本执行有些杀毒软件会对 PowerShell 脚本的执行进行拦截尤其是那些包含网络请求、注册表操作、文件写入的脚本。表现是双击之后没有任何反应或者弹出一个杀毒软件的拦截提示。遇到这种情况先检查杀毒软件的隔离区或者拦截日志看看是不是被拦了。如果是误报可以把脚本文件或者 PowerShell 进程加到白名单里。但要注意不要为了运行一个来路不明的脚本就关闭杀毒软件那样风险太大。提示如果你写的脚本确实需要执行一些敏感操作比如修改注册表、下载文件建议给脚本加上数字签名。这样杀毒软件和 Windows 的 SmartScreen 都会更信任你的脚本。签名可以用Set-AuthenticodeSignature命令来做需要一个代码签名证书。6. 从双击运行延伸到自动化场景搞定了双击运行.ps1之后其实还可以往前再走一步。很多时候我们需要的不是双击运行而是自动运行——比如开机自动执行、定时执行、或者在某些事件触发时执行。这些场景下双击运行的那套配置就不够用了需要用到任务计划程序或者启动目录。6.1 用任务计划程序实现开机自动运行任务计划程序是 Windows 里最可靠的自动化执行方式。相比把脚本放到启动目录任务计划程序的好处是可以设置执行条件、可以以最高权限运行、可以在用户未登录时运行、可以设置失败重试。创建一个开机运行的任务步骤如下按Win R输入taskschd.msc打开任务计划程序点击右侧的创建任务不是创建基本任务基本任务的功能太少在常规选项卡里给任务起个名字比如运行我的 PowerShell 脚本勾选使用最高权限运行如果脚本需要管理员权限在触发器选项卡里新建一个触发器选择启动时或者登录时在操作选项卡里新建一个操作程序或脚本填powershell.exe参数填-NoProfile -ExecutionPolicy Bypass -File C:\scripts\startup.ps1在条件选项卡里取消勾选只有在计算机使用交流电源时才启动此任务如果是笔记本的话点击确定保存用命令行创建的话可以用schtasks命令schtasks /create /tn RunMyScript /tr powershell.exe -NoProfile -ExecutionPolicy Bypass -File \C:\scripts\startup.ps1\ /sc onstart /ru SYSTEM /rl highest这个命令创建了一个在系统启动时以 SYSTEM 权限运行的任务。/ru SYSTEM表示以系统账户运行/rl highest表示最高权限。6.2 启动目录方案的适用场景如果你不需要最高权限也不需要开机就运行用户登录后运行就行那把脚本的快捷方式放到启动目录是最简单的方案。启动目录的路径是C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup在文件资源管理器地址栏输入shell:startup就能直接打开。但这里有个问题启动目录里放.ps1文件本身是不会被执行的你需要放一个快捷方式快捷方式的目标指向 PowerShell 并带上脚本路径。或者放一个.bat包装器。快捷方式的目标可以这样写powershell.exe -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File C:\scripts\startup.ps1-WindowStyle Hidden让 PowerShell 窗口隐藏起来脚本在后台静默运行。这个参数在开机自启场景下很有用避免每次登录都弹出一个黑窗口。6.3 脚本执行日志出了问题怎么查自动化运行最大的问题是出错了你不知道。双击运行的时候你能看到报错但开机自启或者定时任务运行的时候报错信息可能一闪而过或者根本没有窗口显示。解决方案是在脚本里加日志记录。最简单的做法是在脚本开头和结尾加时间戳把输出重定向到日志文件Start-Transcript -Path C:\logs\script.log -Append # 脚本主体内容 Stop-TranscriptStart-Transcript会记录 PowerShell 会话中的所有输出包括命令执行结果和错误信息。-Append参数让日志追加而不是覆盖这样可以保留历史记录。如果不想用Start-Transcript也可以手动写日志function Write-Log { param([string]$Message) $timestamp Get-Date -Format yyyy-MM-dd HH:mm:ss $timestamp - $Message | Out-File -FilePath C:\logs\script.log -Append } Write-Log 脚本开始执行 # 脚本主体内容 Write-Log 脚本执行完毕这种方式更灵活你可以控制哪些信息需要记录、哪些不需要。缺点是每个输出都要手动调用Write-Log比较繁琐。提示日志文件不要放在脚本同目录下因为脚本目录可能是只读的或者会被清理。建议放在C:\ProgramData\或者用户目录下的某个固定位置。另外日志文件要定期清理否则时间长了会占满磁盘。7. 几个值得记住的实操细节最后再聊几个零散但很实用的细节都是我在实际使用中积累下来的。关于-File和-Command的选择-File参数适合执行脚本文件它会正确处理脚本路径中的空格和特殊字符。-Command参数适合执行命令字符串但需要自己处理引号转义。在注册表关联的场景下优先用-File。关于-NoProfile的取舍加-NoProfile可以加快启动速度避免配置文件干扰。但如果你的脚本依赖配置文件里定义的函数或模块就不能加。折中方案是在脚本里显式导入需要的模块而不是依赖配置文件。关于执行策略的恢复如果你改完执行策略之后想恢复默认运行Set-ExecutionPolicy -ExecutionPolicy Restricted -Scope CurrentUser即可。改注册表关联的话把Shell的默认值改回Open或者直接删除Run子键。关于.ps1文件的备份在改注册表之前建议先导出相关的注册表项作为备份。在注册表编辑器里右键点击HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1选择导出保存为.reg文件。如果改出问题了双击这个.reg文件就能恢复。关于不同 PowerShell 版本的差异Windows 10 和 11 自带的是 PowerShell 5.1路径是C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe。如果你安装了 PowerShell 7.x路径通常是C:\Program Files\PowerShell\7\pwsh.exe。在注册表命令里写powershell.exe会调用 5.1写pwsh.exe会调用 7.x。两个版本的语法有细微差异脚本兼容性需要注意。关于 32 位和 64 位在 64 位 Windows 上32 位程序看到的System32目录会被重定向到SysWOW64。如果你在 32 位的程序里调用powershell.exe实际调用的是 32 位的 PowerShell。这通常不是问题但如果脚本里涉及系统路径操作可能会有差异。在注册表里指定完整路径可以避免这个问题。这些细节单独看都很小但组合在一起就是能跑和跑得稳之间的差距。希望这些经验能帮你少走一些弯路。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →