在 Windows 11 下想把“以管理员身份打开 PowerShell 7”和“就定位在当前文件夹”这两件事同时做到我试过各种办法最后落地的方案就是在地址栏敲一条psa.cmd。这个小命令是我自己写的一个批处理脚本作用就是申请 UAC 提升权限、拉起pwsh.exe并且让新窗口的工作目录直接落在当前目录。整个过程不需要改注册表、不需要第三方工具你只要把一个几十字节的脚本放到 PATH 路径里就能在任何文件夹下只输入五个字符得到一个管理员权限的 PowerShell 7。这篇文章就把脚本的写法、存放位置、提权原理和常见的坑一次讲清适合那些不想每次手动cd到对应目录、又希望用上 PowerShell 7 新特性的朋友。1. 为什么非要折腾 psa.cmd现有方式的三个痛点1.1 系统自带的打开方式不是权限不对就是目录不对Windows 11 里打开 PowerShell 的“官方”入口其实不少Win 键加 X 菜单里可以打开“终端管理员”文件夹的右键菜单里也有“在终端中打开”。但你真正用起来就会发现这些入口很难同时满足我需要的两个条件管理员权限和当前工作目录。比如“终端管理员”打开后工作目录通常固定是C:\Windows\System32因为每次提权都会把工作目录重置到系统目录。你如果正在D:\Projects\MyWebApp下面调试脚本打开管理员终端后还得先输入cd /d D:\Projects\MyWebApp才能继续操作。文件夹右键菜单里的“在终端中打开”倒是能定位到当前目录但它默认调用的通常不是管理员权限而且默认标签页还可能是 Windows PowerShell 5.1而不是你要的 PowerShell 7。想要“既提权、又定位当前目录”系统自带的入口基本没有一个能一步到位。1.2 PowerShell 7 和 Windows PowerShell 5.1 的差距在哪很多人觉得“PowerShell 不就是那个蓝底窗口吗”实际上 Windows 11 自带的是 Windows PowerShell 5.1它基于 .NET Framework而微软现在主推的 PowerShell 7 是基于 .NET 的跨平台版本两者不是一个东西。PowerShell 7 里有ForEach-Object -Parallel可以并行处理任务有三元运算符?:有更完善的错误流处理执行效率在大量管道操作时的提升也很明显。我日常维护 Windows 服务、解析日志、批量改文件都更愿意用 PowerShell 7。但问题是 PS7 默认跟右键菜单没有深度集成你可以通过 Windows Terminal 的设置手动加一个配置文件也可以在注册表里添加“在此处打开 PowerShell 7 窗口”的菜单项但那样动静就大了。psa.cmd 的好处是轻量它不修改任何系统设置只是充当一个“启动器”让我在任何目录下快速拉起一个我自己想要的环境。1.3 管理员权限和当前目录本身就是一对矛盾这里绕不开一个底层机制当进程以管理员权限启动时由于 UAC 的完整性级别提升系统会把进程的工作目录默认设置为System32或SysWOW64。换句话说就算你在某个目录里发起提权请求提升后的进程也不会自动继承你的当前目录。这跟“普通权限的终端打开后保持当前目录”完全不同。所以想做到“管理员权限 当前目录”就必须在发起提权时显式告诉新进程工作目录请设置为某个路径。psa.cmd 本质上就是在做这件事先拿到当前目录再用提权参数启动 PowerShell 7同时把工作目录传进去。现在你应该能理解为什么不能直接右键“以管理员身份运行”了——可执行文件自己并不知道你要在哪个目录打开。2. 环境准备装 PowerShell 7 并规划脚本路径2.1 安装 PowerShell 7别忘了验证版本写 psa.cmd 之前先把 PowerShell 7 装上。最简单的办法是用 winget 安装winget install --id Microsoft.PowerShell --source winget如果你想控制安装粒度也可以去 GitHub 的 PowerShell 仓库下载 MSI 安装包安装时建议选择“为所有用户安装”这样pwsh.exe通常会出现在C:\Program Files\PowerShell\7\下面。安装完成之后在任意终端里输入pwsh -v如果能输出类似PowerShell 7.4.6的版本号说明安装成功了。脚本里我会用pwsh.exe作为启动目标如果安装到了非标准位置记得在第 3 步的脚本里改成实际的绝对路径。2.2 psa.cmd 放在哪路径规划比脚本本身更重要地址栏输入命令能够被执行前提是命令名能被系统找到。Windows 的搜索顺序是当前目录、PATH 环境变量中的目录。但要注意通过资源管理器地址栏执行一条命令时命令行程序的工作目录确实是当前文件夹但主程序所在路径还是要靠 PATH 来解析。我没有把脚本塞进C:\Windows\System32因为那是系统目录权限和污染问题都很麻烦。更推荐的做法是在用户目录下建一个专门的 bin 文件夹比如%USERPROFILE%\bin然后把psa.cmd放进去再把%USERPROFILE%\bin加到用户 PATH 里。这样既不碰系统全局变量每台机器上都能用重装系统后也只需要同步一个文件夹。如果你嫌配 PATH 麻烦其实还有一个非常讨巧的位置%LOCALAPPDATA%\Microsoft\WindowsApps。这个目录默认就在用户 PATH 里你把 psa.cmd 丢进去就能直接调用。不过我实测过某些精简版系统或企业策略可能会修改这个目录的权限所以接触新机器时我仍然推荐用bin目录加 PATH 的标准做法出了问题也好排查。2.3 为什么叫 psa.cmd短名字带来低摩擦名字是越小越好的因为地址栏输入命令没有自动补全那种舒适的交互太长就会失去“随手敲一下”的优势。psa我取的是 PowerShell Admin 的简写你也可以叫p7a.cmd、ps7a.cmd只要好记、不跟系统已有命令冲突即可。这里有个小坑有些朋友会把它命名为ps.cmd结果发现系统里本身就有ps.exe相关的命令冲突甚至可能被 PowerShell 的别名机制搞混所以命名时先敲一下where ps看看有没有同名的可执行文件。3. 创建并配置 psa.cmd完整实操步骤3.1 脚本核心代码与逐行解析直接在记事本里新建一个文本文件写入下面这段内容echo off powershell -NoProfile -Command Start-Process -FilePath pwsh.exe -Verb RunAs -WorkingDirectory $PWD.Path保存为psa.cmd。这是一个非常精简的版本我来逐行说清楚它在干什么第一行echo off是让批处理在执行命令时不回显命令本身否则会闪一堆文本影响观感。第二行是核心调用系统自带的 Windows PowerShell 来执行一条启动命令。注意这里调用的是powershell.exe而不是pwsh.exe因为我们要通过 Windows PowerShell 的Start-Process -Verb RunAs来触发 UAC 提权。内部的Start-Process才是真正启动目标 PowerShell 7 的命令。-FilePath pwsh.exe指定要启动的程序。这里用了字符串形式PowerShell 会从 PATH 里找pwsh.exe。如果你安装到了非标准路径建议写成绝对路径比如-FilePath C:\Program Files\PowerShell\7\pwsh.exe。-Verb RunAs是提权开关。只要加上这个参数Start-Process就会通过 ShellExecute 请求管理员权限UAC 弹窗出现用户确认后目标进程以高完整性级别运行。-WorkingDirectory $PWD.Path是整个脚本最关键的部分。它告诉提权后的进程请把工作目录设置为当前 PowerShell 会话所在目录。由于 powershell.exe 是从你所在的资源管理器文件夹里启动的它的$PWD就是当前文件夹所以$PWD.Path就等于当前路径。为什么不直接写%CD%因为%CD%是 cmd 的变量展开时如果路径里带有、^等特殊字符很容易被 cmd 的错误解析给截断。我最初就是直接在命令里展开%CD%结果在某个带的目录下怎么都弹出不了正确的窗口后来改用 PowerShell 的自动变量$PWD.Path才彻底解决。这条经验建议你直接抄。3.2 保存文件时的编码细节脚本内容全是 ASCII 字符理论上保存成 ANSI 或 UTF-8 都无所谓。但如果你以后想给脚本里加中文注释千万注意cmd.exe默认按系统 ANSI 代码页解析批处理文件如果你把文件存成带 BOM 的 UTF-8注释部分很容易乱码极端情况下还会导致脚本执行出错。最稳的办法是统一保存为 ANSI记事本里选择“ANSI”编码或者干脆全用英文内容一步到位。文件扩展名也要看清楚。Windows 默认隐藏文件扩展名新建文本文件后实际文件名叫psa.cmd.txt需要先开启“查看-文件扩展名”然后重命名为psa.cmd。如果你不确定是否成功打开命令提示符切到脚本所在目录输入dir能看到psa.cmd没有.txt后缀才算对。3.3 配置 PATH 的两种方式如果选择建%USERPROFILE%\bin来存放脚本就在资源管理器地址栏输入%USERPROFILE%\bin回车如果文件夹不存在就新建一个。然后打开“设置-系统-关于-高级系统设置”点“环境变量”在“用户变量”里找到Path编辑新增一行%USERPROFILE%\bin确认保存。不想点这么多层界面的话可以直接用 PowerShell 执行这条命令[Environment]::SetEnvironmentVariable(Path, $env:Path ;%USERPROFILE%\bin, User)执行完之后记得重新打开资源管理器或直接注销再登录让新 PATH 生效。如果不想重启也可以在地址栏输入时用绝对路径测试但那样就不方便了。配置完之后可以按Win R输入cmd打开命令提示符输入where psa.cmd如果输出路径为C:\Users\你的用户名\bin\psa.cmd说明 PATH 解析成功了。3.4 实战测试在地址栏输入 psa.cmd打开任意一个有意义的文件夹比如D:\Work\Scripts在资源管理器地址栏里直接输入psa.cmd按回车系统会先弹出 UAC 提权窗口。注意这个窗口底部的发布者信息大概率显示“Microsoft Windows Publisher”或者“未知发布者”因为脚本本身没有数字签名。确认后PowerShell 7 的窗口就会弹出来。在新窗口里执行Get-Location $PSVersionTable.PSVersion如果第一行显示D:\Work\Scripts第二行显示主版本为 7.x说明脚本完全成功。我实测过几十次正常情况下这个流程不会超过三秒。3.5 进阶一键注册右键菜单其实没必要网上有很多教程教你在注册表里添加“在此处打开 PowerShell 7管理员”菜单项。我不是很推荐原因是每次修改HKEY_CLASSES_ROOT\Directory\shell都有风险一旦写错右键菜单异常甚至资源管理器崩溃的问题都很烦。相比之下psa.cmd 这种“地址栏命令”的方式零污染也不依赖具体的右键菜单上下文。而且你还可以把psa.cmd放到 Windows Terminal 的配置里做一个“动作”或者设置成快捷键但这些都是额外的玩法核心逻辑够用了。4. 原理与避坑UAC、工作目录和执行策略4.1 UAC 提权到底发生了什么很多人第一次跑 psa.cmd 会被 UAC 弹窗吓到以为脚本在搞什么大动作。其实-Verb RunAs就是让系统弹一个标准的管理员同意框。UAC 是 Windows 的安全边界管理员用户在标准令牌下运行需要提权时才弹出确认。psa.cmd 本身并没有绕过 UAC也不能绕过 UAC它只是发起了提权请求。值得注意的一点提权后的进程不会再继承父进程的安全上下文所以它也不会自动继承“当前目录”这个环境信息。这才需要我们专门用-WorkingDirectory把路径传过去。可以这样理解UAC 就像一个安全门人过了门之后随身带的东西被安检拦下了大半你必须在过门之后重新告诉他“我要去哪个位置”。4.2 为什么有时候工作目录仍然变成 System32虽然脚本里指定了-WorkingDirectory $PWD.Path但在两种情况下仍可能失效。第一种情况是当前目录被提权后的进程访问不了比如网络共享目录 UNC 路径或者受控文件夹列表保护下的路径管理员令牌不一定有权限直接读取。第二种情况是目标路径本身由 32 位进程重定向导致比如你在某些兼容性环境的目录下运行时64 位进程的工作目录可能被重定向到SysWOW64。遇到工作目录不对时先别急着改脚本手动在 PowerShell 7 里执行Set-Location -LiteralPath 原路径看看能不能访问。如果原路径本身可访问那大概率是脚本传参问题。我个人比较保守的做法是启动之后加一个安全兜底如果工作目录跟$PWD不一致就直接用环境变量判断但那样会增加脚本复杂度日常用基础版就够了。4.3 执行策略会影响 psa.cmd 吗这里需要区分“ cmd 脚本”和“PowerShell 脚本”。psa.cmd是批处理它的运行不受 PowerShell 执行策略限制。所以即使你的Get-ExecutionPolicy是Restricted也不影响 psa.cmd 执行。真正受影响的是 PowerShell 7 窗口里后续执行.ps1脚本的规则。但有两个小坑值得提醒。第一如果你在 psa.cmd 里写的不是-Command ...而是保存成一个.ps1文件然后再去调用那执行策略就会介入可能弹出“禁止运行脚本”的错误。第二虽然-Command不查执行策略但如果你本人在 PowerShell 7 里需要跑脚本请先确认执行策略不是Restricted。可以在 psa.cmd 启动的窗口里执行Get-ExecutionPolicy如果显示Restricted用管理员权限执行Set-ExecutionPolicy RemoteSigned -Scope LocalMachine这样才能正常跑你自己写的 ps1 脚本。4.4 常见问题速查表现象可能原因解决思路地址栏输入 psa.cmd 提示“不是内部或外部命令”脚本所在目录不在 PATH 里或者系统缓存未刷新重新检查where psa.cmd确认 PATH 拼写重启资源管理器UAC 弹窗一闪而过没有 PS7 窗口当前目录不可访问或 pwsh.exe 路径不对先换到普通目录测试确认-FilePath指向的路径真实存在打开的还是 Windows PowerShell不是 7脚本里错误调用了powershell.exe而不是pwsh.exe检查-FilePath是否为pwsh.exe如果安装路径特殊用绝对路径窗口打开后目录变成 C:\Windows\System32-WorkingDirectory参数没有生效或目标不可访问确认当前目录权限检查是否网络路径尝试补一条Set-Location兜底路径中含或中文导致命令错乱批处理展开变量时被 cmd 错误解析使用$PWD.Path而不是%CD%确保脚本内容为纯 ASCIIUAC 一直弹但确认后没有窗口部分安全软件会拦截提权加载 pwsh.exe查看安全软件的进程拦截日志考虑替换启动目标为 powershell.exe 做中转4.5 我踩过的几个真实坑第一次写这个脚本时我犯了两个错一个是在Start-Process参数里用了-Verb RunAs却忘了加-WorkingDirectory结果窗口半天起不来起来之后跑到System32去了等于白干。第二个是傻乎乎地把脚本命名为ps.cmd结果跟系统里已有的ps.bat之类的命令冲突在部分机器上地址栏输入后执行的是另一个程序排查了半天才反应过来。后来我统一用psa.cmd并在脚本里加注释这样即使以后换机器看到文件名也能想起它的作用。还有一个日常习惯问题地址栏输入命令后 UAC 弹窗还没出来你可能会以为没反应然后重复回车。实际上 Windows 会排好几个 UAC 请求你得一个个点掉结果就是打开好几个 PS7 窗口。所以敲完回车就安心等弹窗别急躁。5. 让 psa.cmd 更顺手参数传递和扩展思路5.1 给脚本增加自定义参数基础版只解决“打开管理员 PS7 并定位目录”这个需求但实际使用中我经常还想在启动时自动跑一段代码比如切到某个虚拟环境、导入某个模块。可以这样改造脚本echo off powershell -NoProfile -Command Start-Process -FilePath pwsh.exe -Verb RunAs -ArgumentList -NoExit,-NoProfile,-Command,Set-Location -LiteralPath $PWD.Path; %*这里把用户输入的参数拼接到启动命令后面。但注意拼接参数会引入转义和特殊字符风险如果不做完整的安全校验建议只在完全信任的环境中使用。我个人更推荐保持基础版干净把额外的初始化逻辑写进 PowerShell 7 的$PROFILE里这样每次打开自动加载还能全局复用。5.2 把 psa.cmd 变成文件夹环境启动器如果你经常维护某个项目文件夹可以再把 psa.cmd 扩展成“读到当前目录下的.ps1启动脚本就自动执行”。比如在当前目录下放一个init.ps1里面定义好项目环境变量、模块引用和别名然后在 psa.cmd 里启动 PS7 后自动运行if (Test-Path .\init.ps1) { . .\init.ps1 }这样在项目目录里输入psa.cmd提权后不仅能定位到当前目录还会自动加载项目专属环境。这对手动测试、部署脚本特别有用。当然也要注意自动执行init.ps1意味着任何一个放在该目录下的脚本都有可能被提权运行安全边界要自己把控。5.3 安全建议警惕可被篡改的脚本路径最后必须说一句安全相关的内容。psa.cmd 的权限非常高它一旦被恶意修改放在 PATH 里的脚本可能在提权瞬间执行任意命令。所以我建议做到三点第一脚本存放在自己的用户目录底下不要放在任何人可写的共享目录第二如果系统有多用户确保%USERPROFILE%\bin只有你自己有写权限第三对脚本本身做定期核对或者用文件哈希记录基准值防止被无声替换。5.4 在 Windows 11 新版本上的兼容性我在 Windows 11 24H2 以及 26H2预览分支上测试过地址栏执行自定义 PATH 中的.cmd这个行为依旧有效资源管理器并没有限制这类命令。唯一的变化是 UAC 弹窗样式和 Windows Terminal 默认配色在不同版本里略有差异但脚本逻辑不受影响。如果你所在的 Windows 11 版本更新后突然失效先检查是不是 PATH 环境变量被系统更新重置了再检查资源管理器有没有新增安全策略。我个人在实际使用中的体会是这个脚本最大的价值不是省那几秒钟而是把“提权”和“定位目录”这两个高频动作固化成了肌肉记忆。你不需要再思考“我现在在哪个路径、终端是不是管理员”只要敲一下psa.cmd想做事的状态就绪。后面我还想给它加一个文件拖拽支持选中一个脚本文件拖到 psa.cmd 上直接以管理员权限用 PS7 运行。这样对于经常测试 ps1 脚本的朋友会再方便不少。如果你想继续扩展就先从“参数传递”开始玩改完务必在临时目录里验证确认没有特殊字符问题再放到正式环境。