先别急着去改什么注册表,也别一上来就研究快捷方式属性。你之所以搜这个话题,大概率是每天打开 PowerShell 后都要手动敲一遍cd D:\work这种命令,或者明明在项目文件夹里按 Shift+右键打开终端,结果还是被丢到用户目录。我告诉你正确的解决思路:让 PowerShell 每次启动时自动执行一条“切换目录”命令,一劳永逸,且对所有入口都生效。
这个操作并不复杂,核心就两个词:配置文件(profile)和执行策略。本文会从“默认目录从哪来”讲起,再到完整的配置步骤、中文路径乱码等细节,最后附上常见的踩坑速查表。不管是 Windows PowerShell 5.1,还是后装的 PowerShell 7,你都能对号入座。
1. 先搞清楚 PowerShell 的“默认目录”到底在哪儿
1.1 同一个 PowerShell,不同打开方式,默认目录居然不一样
很多新手会困惑:为什么我明明改好了设置,换个方式打开 PowerShell 又回到老位置?因为 Windows 里的“启动目录”根本不是全局唯一的,它取决于你用什么入口启动程序。
我整理了一个对照表,能帮你快速判断自己属于哪种情况:
| 打开方式 | 默认工作目录 |
|---|---|
| 开始菜单点击“Windows PowerShell” | C:\Users\你的用户名 |
| 右键开始菜单,选“以管理员身份运行” | C:\Windows\System32 |
在文件资源管理器地址栏输入powershell | 当前所在文件夹 |
Win+R 运行框输入powershell | C:\Users\你的用户名 |
| 通过 Windows Terminal 打开 | 看 Windows Terminal 的配置,默认是用户目录 |
| 通过“快捷方式”双击打开 | 看快捷方式属性里的“起始位置” |
由此可见,如果你只改某个快捷方式的属性,那么从开始菜单右键、从运行框打开的 PowerShell 就完全不听你的。而且,管理员窗口默认落在C:\Windows\System32,普通用户窗口落在用户目录,这俩初始位置还不一样,够乱的。
1.2 为什么改快捷方式不是最靠谱的方案
快捷方式属性里有一个“起始位置”字段,有的朋友会直接填上目标文件夹路径,发现双击快捷方式确实能进目录。但问题在于:这种方式只管“这一个快捷方式”。一旦你在文件资源管理器里输入 powershell,或者被某个 IDE 内部调起,它就不生效了。
真正理想的方案应该满足两个条件:第一,不管从哪个入口启动,都能自动落在指定目录;第二,原理简单、排查容易、不会影响系统稳定性。而 PowerShell 的 profile 配置文件天然满足这两点——它本质是一个每次启动都会自动加载的脚本,我们只需要在里面写一行切换目录的命令。
2. 核心操作:把“默认文件夹”写进 PowerShell 配置文件
2.1 profile 文件是什么,为什么它能管用
PowerShell 启动时会按顺序自动加载一组.ps1脚本,其中和当前用户、当前主机对应的那个文件,就是 profile。你可以把它理解成“开机自启动脚本”的 PowerShell 版本,只是它只在你打开 PowerShell 窗口时执行,不会在系统启动时执行。
输入下面这行命令,就能看到当前用户对应的 profile 路径:
$PROFILE在 Windows PowerShell 5.1 里,路径一般是:
C:\Users\你的用户名\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1如果你用的是 PowerShell 7(pwsh),路径会变成:
C:\Users\你的用户名\Documents\PowerShell\Microsoft.PowerShell_profile.ps1如果你从没手动创建过这个文件,$PROFILE虽然显示路径,但文件名对应的文件不一定存在。可以用Test-Path检查一下:
Test-Path $PROFILE返回True说明文件存在,False说明还没有,需要自己创建。
认真看一下,$PROFILE其实有四种类型:所有用户-所有主机、所有用户-当前主机、当前用户-所有主机、当前用户-当前主机。我们日常个人用途只需要关注“当前用户-当前主机”这个,也就是$PROFILE默认指向的那个。这样不会影响其他用户,也不需要管理员权限。
2.2 创建 profile 并写入默认目录,完整实操
步骤非常少,下面是完整命令序列:
# 1. 查看当前用户的 profile 路径 $PROFILE # 2. 如果文件不存在,就创建它;如果存在,跳过这一步 if (!(Test-Path -Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force } # 3. 用记事本打开编辑 notepad $PROFILE在打开的记事本里,添加一行:
Set-Location "D:\work"大功告成一半。保存关闭后,开一个新的 PowerShell 窗口,你会发现工作目录已经自动变成D:\work。
这里要解释几个关键点,不是每个教程都会讲清楚:
Set-Location和cd是等价的,cd是Set-Location的别名。写哪个都行,但从可读性角度,我推荐在配置文件里用完整命令Set-Location。- 路径如果包含空格,必须用双引号包起来,比如
Set-Location "D:\My Project",否则 PowerShell 会把它拆成多个参数,命令直接报错。 - 这一行不要写在
exit后面。有些人习惯在 profile 末尾加exit来加快启动,但exit后面的命令永远不会执行,而且你的窗口会直接关闭,很坑。 - 如果后面还有别的设置项,把
Set-Location放在所有环境变量、别名定义之后,避免后续命令临时改动了目录,最终效果被覆盖。
2.3 第一次运行被“禁止运行脚本”拦下来
很多人做完上面几步,重启 PowerShell 后发现还是老位置,原因就是 Windows PowerShell 默认的执行策略是Restricted,任何.ps1脚本都不允许运行,profile 自然也被禁用了。
你可以用这条命令查看当前策略:
Get-ExecutionPolicy -List输出结果会按作用域列出多项,重点关注CurrentUser这一行,默认一般是Undefined,它继承自本地组策略或默认值Restricted。
解决办法是只对当前用户放开“本地脚本”的执行权限,推荐设置为RemoteSigned:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned -Force这行命令的意思很简单:本地创建的脚本允许运行,从网上下载来的脚本必须带有可信发布者签名才能执行。这是日常开发最常用的平衡方案,安全性比直接改成Unrestricted高很多,而且完全不需要管理员权限。
设置完再重启 PowerShell,配置就生效了。
3. 实操中的三个关键细节
3.1 中文路径乱码:编码问题比命令本身更坑
如果你的目标文件夹是英文路径,前面几章已经很顺利。但一旦路径里带中文,比如Set-Location "D:\项目\工作",很可能会遇到一个诡异现象:明明路径是对的,PowerShell 却提示找不到路径,或显示乱码。
原因出在文件编码上。Windows PowerShell 5.1 默认按 ANSI(GBK/GB2312)读取没有 BOM 标记的脚本文件。如果你用 VS Code 等编辑器把 profile 保存成“无 BOM 的 UTF-8”,那么里面的中文字符就会被错误解析,路径自然就乱了。
解决办法非常明确:把 profile 文件保存为 UTF-8 with BOM。
实操细节:
- 用 Windows 自带的记事本:在“另存为”对话框底部,编码选择“UTF-8”。旧版记事本保存的 UTF-8 是带 BOM 的,直接可用。
- 用 VS Code:点击右下角编码区域,选择“通过编码保存”,然后选“UTF-8 with BOM”。不要选“UTF-8”(无 BOM)。
- 如果你已经踩了乱码坑,不要慌,重新打开 profile,全选复制,然后用 VS Code 新建文件,粘贴,另存为“UTF-8 with BOM”,覆盖回去即可。
用一句通俗的话总结:在 Windows PowerShell 5.1 里,宁可保存成带 BOM 的 UTF-8,也不要无 BOM。它在读取无 BOM 文件时容易犯迷糊。
3.2 管理员窗口和普通窗口,profile 是否通用
这是被问到最多的问题之一。答案是:同一用户下,管理员窗口和普通窗口读取的 profile 文件是同一个。只要你是用同一个账户,右键“以管理员身份运行”打开 PowerShell,它同样会加载你刚才配置的 profile,Set-Location也会照常执行。
所以不用为管理员窗口额外配置一遍。哪怕管理员窗口初始目录是C:\Windows\System32,profile 里的一行Set-Location会把当前目录直接拉到你指定的位置,你看到的就是目标文件夹。
只有一种情况要注意:如果你在 UAC 弹窗里选择的是另一个管理员账户(比如内置 Administrator),那么 PowerShell 加载的 profile 是那个账户的 profile,路径完全不同。遇到这种情况,需要给那个账户单独配置一份。
新手千万别去动“所有用户”的 profile 文件(通常位于C:\Program Files\PowerShell\7\profile.ps1),它需要管理员权限,而且影响所有用户,改错了代价很大。个人电脑上,当前用户 profile 足够用了。
3.3 只想临时进某个目录,不想写配置怎么办
有时候你并不是希望所有窗口都默认进目录,只是想“这次打开就进那个文件夹”。这种情况完全没必要改 profile,直接在启动命令里带参数就行:
powershell -NoExit -Command "Set-Location 'D:\project'"也可以把它做成快捷方式。右键新建快捷方式,目标位置填:
powershell.exe -NoExit -Command "Set-Location 'D:\project'"这样双击快捷方式就会打开 PowerShell 并直接进入D:\project,不会影响系统里其他 PowerShell 窗口的行为。
我建议你做选择前先想清楚自己的实际需求:
| 需求 | 推荐方案 |
|---|---|
| 所有入口打开 PowerShell 都进同一目录 | profile 文件 + Set-Location |
| 只用某个快捷方式进目录 | 快捷方式“起始位置”或 -NoExit 参数 |
| 只希望 Windows Terminal 进目录 | Windows Terminal 的“起始目录”设置 |
| 偶尔进一下 | 手动cd即可 |
4. 常见问题与排查技巧速查表
4.1 改了 profile 但没生效,按什么顺序查?
如果你照着操作,但重启后新窗口还是停在老目录,不要急着怀疑 PowerShell 坏了,按下面的顺序排查:
- 文件名是否带 .txt 后缀。这是新手最容易犯的错误,记事本保存时默认会追加
.txt。PowerShell 只认Microsoft.PowerShell_profile.ps1,如果你保存成Microsoft.PowerShell_profile.ps1.txt,它根本不会加载。 - 文件是否在正确的目录。用
$PROFILE看路径,确认文件就放在打印出来的位置。如果有 OneDrive 或“文档”目录被重定向的情况,路径会跟你想的有些偏差。 - 执行策略是否为 Restricted。运行
Get-ExecutionPolicy -List,如果CurrentUser显示Undefined或Restricted,按前面第 2.3 节设置一次。 - 文件内容是否真的执行了。临时在 profile 最后加一行
Write-Host "profile loaded OK",重启 PowerShell 看有没有输出。如果没输出,说明文件根本没被加载;有输出但目录没变,说明Set-Location又被后面的命令覆盖了。 - 是不是启动路径本身有问题。仔细检查路径是否包含中文,是否带有不可见字符,先用简单的英文路径
C:\temp试验一下,排除编码和转义问题。
4.2 升级了 PowerShell 7,原来的配置却失效了
这是 Windows PowerShell 5.1 和 PowerShell 7 长期共存后的经典问题。两个版本的 profile 路径不一样:
- 5.1 的 profile:
C:\Users\你的用户名\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 - 7 的 profile:
C:\Users\你的用户名\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
你在 5.1 里改好的配置,PowerShell 7 不会主动读取。解决办法很简单:把旧 profile 里的内容复制到新位置,或者直接在 PowerShell 7 里重新执行一遍创建流程。从长期来看,尽量以 PowerShell 7 的 profile 为准,因为新版本功能更全、维护更活跃。
如果连终端模拟器也换了(比如从“Windows Terminal”里跑 PowerShell),还需要区分是终端模拟器本身的起始目录设置,还是 profile 在起作用,别把两个层级的配置搞混。
4.3 想连 CMD 一起改默认目录,可以吗?
严格来说,CMD 和 PowerShell 是两套东西。本文的 profile 方案只对 PowerShell 生效。如果你平时也会用到 CMD,希望它也能自动进某个目录,有几种办法:
- 快捷方式属性里设置“起始位置”,和早期 PowerShell 方案一样,只管快捷方式入口。
- 注册表 AutoRun。
HKCU\Software\Microsoft\Command Processor下面有一个AutoRun字符串值,写入cd /d D:\work后,每次启动cmd.exe都会自动执行。但我不推荐新手随意碰这个键,因为它影响所有 CMD 窗口,一旦写错,连开 CMD 都会报错,不如只在快捷方式里设置,或者干脆记住“CMD 是 CMD,PowerShell 是 PowerShell”。
4.4 开机自启和默认目录是两码事,别混为一谈
有些人搜索“PowerShell 默认目录”时,真实需求可能是“开机自动执行某个 PowerShell 脚本”。这里要澄清一下:profile 文件只在 PowerShell 窗口启动时加载,它不会开机自启。
如果你确实需要开机自动跑脚本,正确做法是:
- 把要执行的脚本编写成一个
.ps1文件。 - 创建一个快捷方式,目标填:
powershell.exe -ExecutionPolicy Bypass -File "C:\path\to\script.ps1"。 - 把这个快捷方式放进启动文件夹(按 Win+R,输入
shell:startup可以打开)。 - 或者用“任务计划程序”设置更精细的触发条件和权限。
这些做法的生效点比 profile 更底层,不要在 profile 里绕远路。
5. 进阶玩法:把“默认文件夹”升级成“默认工作台”
5.1 给常用目录配置专属快捷键
如果你不只需要一个固定目录,而是经常在几个目录之间切换,每次都把 profile 里的Set-Location改来改去也太累了。更好的做法是定义一批函数,一次性放进 profile:
function home { Set-Location $HOME } function work { Set-Location 'D:\Projects\server' } function docs { Set-Location 'D:\Docs\archive' } function tmp { Set-Location 'C:\Users\你的用户名\AppData\Local\Temp' }保存后重启,直接输入work回车,就能进入D:\Projects\server。这种函数方式不需要额外记忆完整路径,越用越顺手,我也不用每次在 profile 里写死唯一的目录。
5.2 进入目录后自动加载提示信息
你还可以在 profile 里加一点反馈,让 PowerShell 打开后第一眼就知道自己在哪:
Set-Location 'D:\work' Write-Host "当前工作目录: $(Get-Location)" -ForegroundColor Cyan看起来简单,实际作用不小。尤其是多个项目目录之间频繁切换时,窗口一打开就能确认位置,避免“我到底在哪个目录”的恍惚感。
如果你愿意折腾,还可以把 oh-my-posh、posh-git 这类美化工具也放到 profile 里,让命令行提示符显示 Git 分支状态、当前目录等信息。这一步完全可以作为后续扩展,不影响本文的默认目录配置。
5.3 和 Windows Terminal 的“起始目录”配合使用
很多朋友日常用的是 Windows Terminal,而不是原生 PowerShell 窗口。这时候可以把两层配置分开理解:
- Windows Terminal 的“起始目录”,负责控制“打开 Windows Terminal 后,新选项卡落在哪个目录”。
- PowerShell 的 profile,负责控制“不管从哪个入口打开 PowerShell,最终都切到哪个目录”。
如果两者同时存在,最终生效的是 profile 里的Set-Location,因为它在 shell 内部执行,时机更晚。所以你可以让 Windows Terminal 先落在一个中性目录,再让 profile 统一把所有 PowerShell 会话拉回目标位置。也可以反过来,在 Windows Terminal 设置里直接填目标目录,profile 里就空着。两种风格都行,关键是你得知道它们会叠加生效,别以为配了 Windows Terminal 就不需要 profile,或者反过来。
6. 最后,关于这个配置我的一些实际体会
我自己最早是用快捷方式“起始位置”解决的,结果发现右键打开完全不生效,折腾到怀疑人生。后来切换到 profile 方案,才感受到真正的省心:所有入口统一生效,维护也集中。中间还踩过中文路径乱码这个坑,最后总结出一句话:Windows PowerShell 5.1 里,profile 文件尽量保存成 UTF-8 with BOM。这个细节,很多教程压根不会提。
如果你刚开始配,我的建议是先把正文里的步骤完整走一遍,再用Test-Path验证文件是否存在,最后重启窗口确认目录。别想着一次配置就搞出很复杂的工作台,先让Set-Location生效,然后慢慢往 profile 里加函数、别名、提示符美化。改 profile 前记得先备份原文件,等哪天你往里面加了几十个函数,就知道备份多重要。
最后再分享一个小技巧:如果你不确定当前配置有没有生效,打开 PowerShell 后输入(Get-Location).Path,屏幕上显示的就是实际工作目录;如果跟你预期不符,优先查执行策略和 profile 文件编码,这两项至少能解决七成问题。