简介:这份压缩包提供 Notepad++ 7.5.1 免安装版本,面向需要在受限权限环境、移动存储设备或临时办公场景中快速编辑文本与代码的程序员、运维人员和普通用户,解压即可运行,省去安装流程。包内共 155 个文件,以 xml 语言与配置数据、dll 插件组件、ini 配置文件和 exe 主程序为主,附带少量 html、txt、log 及快捷方式文件,整体约 3.36MB,体积轻巧便于携带。它保留语法高亮、多文档编辑、查找替换、代码折叠等常用能力,并集成 Markdown 查看、编码转换等插件模块,可用于代码查看、日志排查、配置修改和日常文本处理。压缩包还包含多语言界面与插件依赖配置,启动后可按需启用,适合在无法安装软件或需要便携使用的电脑上快速恢复编辑环境。已有 1135 人学习下载,适合希望获得稳定旧版、免安装快速部署或补充轻量编辑工具的用户参考使用。
1. 免安装记事本:真正省掉的不是安装步骤,而是“换台机器还能不能按原样打开”
机房跳板机、客户生产机、写保护的维护盘,这些地方你装不了任何软件,但偏偏要改一个 ini、看一眼日志、把压缩成一行的 JSON 掰开看。这时候从 U 盘双击一个 exe,比走一遍软件申请流程快得多。搜 notepad 免安装版的人,要的其实就是这个东西:配置跟着目录走,不往系统目录写文件,用完拔盘不留痕。它适合经常在别人机器上干活的人、需要把工具塞进维护盘的人,以及只想有个干净文本入口、不愿为改一行配置去装几百兆编辑器的人。它不负责功能强大,负责的是“随时能用、用完能走”。
2. 拆一个便携目录:配置落点、启动优先级与自建步骤
很多人拿到一个压缩包,解压、双击、能打开,就默认它是免安装版了。这个判断只对了一半:能跑不代表状态可携带。程序本体确实只有一个可执行文件,但字体、字号、窗口位置、自动换行开关、最近打开列表这些东西,默认是写进当前用户配置里的。换台机器打开,还是默认宋体、默认编码、默认窗口大小,因为那些设置根本没跟过来。这一章先把目录拆开看清楚,再动手拼一个自己的。
2.1 便携版和“解压即用”差的到底是哪几个文件
系统自带记事本的“状态外置”问题最典型:程序就一个文件,配置却留在系统盘。所以真正的免安装版要解决的核心不是“不写注册表”,而是“状态跟着目录走”。常见的实现方式有三种,成本依次升高,可移植性也依次变好。
第一种是改配置后端,程序本身支持从同目录的 ini 读取配置,并且优先级高于系统里的用户配置。这种做法最干净,删目录即卸载,没有任何残留。第二种是加启动器,用一个几十行的批处理或者一个小包装程序,在启动前把跟配置相关的环境变量指向程序目录。这种做法通用性强,几乎所有单文件程序都能这么包一层。第三种是加重定向层,拦截对注册表和用户目录的写入,落到本地文件里。
我一般优先找第一种,找不到再考虑第二种,第三种只在必须保留原版行为时才用。原因很实际:多一层拦截就多一层排查成本,出问题时你很难判断是程序本身的毛病,还是重定向层把某个路径搞错了。血泪经验是,重定向层写得不好,最容易出现“配置文件读得到、临时文件写不进去”的半残状态,界面看着正常,一保存就报错。
判断手里这个包属于哪一种,最直接的办法是看目录结构。合格的结构通常是这样:
| 路径 | 作用 | 缺失后的后果 |
|---|---|---|
| notepad.exe | 主程序 | 无法启动 |
| config/ 或 *.ini | 配置落点 | 每次打开都是默认状态 |
| 启动.bat / launcher.exe | 环境重定向 | 配置可能写回用户目录 |
| 卸载右键菜单.bat | 清理注册项 | 换机器后残留死链 |
| readme.txt | 版本与编码说明 | 不知道默认编码,接手就踩坑 |
如果压缩包里只有一个 exe 加一个“使用说明.txt”,那基本可以判定为“解压即用”而不是“便携”。它能跑,但状态不跟人走,你在 A 机器上把字体调到 14 号,到 B 机器上还得再调一遍。这种包不是不能用,只是你要清楚它的边界,别指望它替你保存工作环境。
2.2 启动时的读取顺序:为什么你的设置“第二天就没了”
配置到底从哪来,是这类工具最容易让人困惑的地方。通用优先级大致是:命令行参数 > 程序目录下的配置文件 > 用户配置目录 > 系统内置默认值。注意这个顺序里没有“注册表优先”这一说,具体哪个生效,取决于程序本身的实现,所以最靠谱的办法是实测,而不是猜。
实测方法很简单:在目录里改一个显眼的设置,比如把字体改成 16 号,退出程序,然后看目录内文件的修改时间有没有变。
# 列出程序目录下 5 分钟内被修改过的文件 Get-ChildItem -Path . -Recurse -File | Where-Object { $_.LastWriteTime -gt (Get-Date).AddMinutes(-5) } | Select-Object LastWriteTime, Length, FullName这条命令的逻辑是拿当前时间往前推 5 分钟做过滤,只留最近被动过的文件。参数上-Recurse会连子目录一起扫,-File排除目录本身。如果输出为空,而你又确实改过设置,说明配置没写进目录,而是去了用户配置目录或注册表。这个结论基本就等于“换机器必丢设置”。
再补一步更狠的验证:把整个目录设成只读,再启动一次。真正做便携的版本会给出明确提示,或者降级成只读模式继续跑;假便携的版本会静默失败,你在界面上改的设置退出就没了,而且没有任何报错。这一步看着有点玄学,但它是最快区分真假便携的办法,比翻文档快得多。
还有个容易忽略的点:临时目录。很多程序启动时会在系统临时目录建缓存,这个路径同样是外置的。所以完整的重定向不只是配置目录,还包括临时目录。只改一半的结果是,配置跟走了,缓存还留在原机器上,某些场景下会出现“配置对但行为不对”的怪现象。
2.3 从零拼一个便携目录
自己拼一个最省事,不用去猜别人的包是怎么封的。四步:建骨架、放主程序、写启动脚本、自检。
第一步,在 U 盘或者本地工具盘里建目录,结构按 2.1 那张表来,config和tmp先建好。
第二步,把主程序放进去。这一步唯一要注意的是从哪拿——优先用系统里已有的那一份直接拷贝,版本行为你最熟悉,不会出现“换了版本之后某些菜单项不见了”的意外。
第三步,写启动脚本。这是整个便携化的核心,别嫌它土:
@echo off rem 便携启动器:把配置相关的用户目录重定向到程序目录下 setlocal set "APP_DIR=%~dp0" set "CFG_DIR=%APP_DIR%config" if not exist "%CFG_DIR%" mkdir "%CFG_DIR%" rem 多数程序会把配置和缓存写到这两个变量指向的位置 set "APPDATA=%CFG_DIR%" set "LOCALAPPDATA=%CFG_DIR%" rem 临时文件也一并收进目录,避免在原机器留垃圾 set "TEMP=%CFG_DIR%\tmp" if not exist "%TEMP%" mkdir "%TEMP%" rem %* 原样透传参数,方便把文件直接拖到 bat 上打开 start "" "%APP_DIR%notepad.exe" %* endlocal几个参数必须说清楚。%~dp0是当前批处理所在的目录,带尾部反斜杠,所以后面拼接不用再加。setlocal/endlocal保证这些变量只在本次脚本里生效,不污染你当前的命令行窗口。start ""里那个空引号是窗口标题占位,少了它,当路径带空格时整个命令会被拆错,这是最常见的翻车点之一。%*透传所有参数,把文件拖到 bat 图标上就能直接打开。
第四步,自检。连着启动两次,第一次改字体、关闭自动换行,第二次看这些设置还在不在;然后打开config目录看有没有新文件生成。如果两次行为一致,且目录里确实多了东西,这个便携包就算成了。之后换任何一台机器,只要把整个目录拷过去,行为完全一致。
注意:重定向
APPDATA会让从这个脚本启动的所有子进程都继承这套环境变量。如果你在这个 bat 里再拉起别的程序,它们也会把配置写进这个目录,看起来像“串味”,实际是继承,排查时别往程序 bug 上想。
3. 配置与启动参数:把“打开即用”固化成可复制的状态
便携目录搭好之后,接下来的问题是怎么让它一打开就是你要的样子。靠每次手动调是没戏的,必须落到配置文件和启动参数上。这一章把配置项、启动封装和右键菜单三件事讲透,都是能直接抄的。
3.1 配置项逐条过:哪些能改、哪些改了也没用
记事本类工具的配置项不多,但每一项都容易在跨机器交接时出问题。下面这张表是我自己踩过之后整理出来的,按影响面排序:
| 配置项 | 常见取值 | 影响面 | 便携场景的注意点 |
|---|---|---|---|
| 默认编码 | ANSI / UTF-8 / UTF-8 带 BOM | 新建文件存盘格式 | 老版本默认 ANSI,跨系统交接必改 |
| 换行符 | CRLF / LF / CR | 文件在别的工具里是否显示成一行 | 记事本不认 LF,这是最高频的坑 |
| 字体与字号 | 等宽字体,10~12 | 长行对齐、中文显示 | 字体缺失会静默回退,视觉错位 |
| 自动换行 | 开 / 关 | 长行阅读体验 | 看日志建议关,看文章建议开 |
| 状态栏 | 开 / 关 | 行列号、编码提示 | 排查编码问题第一眼就看这里 |
| 最近文件列表 | 保留 / 清空 | 隐私与目录残留 | 确认它写在目录内,别写回用户目录 |
重点说前两项。默认编码决定了你新建文件时按什么格式存盘,这个设置在便携场景下几乎必改,因为你要面对的机器横跨很多年,新系统和老系统对“ANSI”的理解可能完全不同,同一个中文字符存出来字节都不一样。换行符的问题下一章单独展开,这里先记住一个结论:任何要跨工具、跨系统流转的文本文件,换行符都必须是显式指定的,不能靠默认值赌。
字体这一项看着无关紧要,实际影响不小。你在一台装了等宽字体的机器上配好,拿到一台只有基础字体的机器上,程序会静默回退到别的字体,长行对齐立刻散架,用来看列对齐的配置文件会很难受。处理办法是把字体文件一起塞进便携目录,或者干脆选一个到处都有的基础等宽字体。
3.2 用启动参数覆盖默认值
记事本本身的命令行参数非常少,基本就是“程序 + 文件名”。所以所谓参数化,实际是靠批处理封装出一层自己的行为。我常用的有两个封装,一个负责“只看不改”,一个负责“先归一化再打开”。
先看“只看不改”这个。很多时候你打开一个文件只是想看一眼,最怕的就是手滑改了原文件还保存了。封装思路是先复制到临时目录,再从临时目录打开,原文件根本不在编辑范围内:
@echo off setlocal set "APP=%~dp0notepad.exe" set "WORK=%~dp0tmp\peek" if not exist "%WORK%" mkdir "%WORK%" rem 原样复制一份到临时区,避免误改源文件 copy /y "%~1" "%WORK%\" >nul start "" "%APP%" "%WORK%\%~nx1" endlocal参数说明:%~1是拖进来的第一个文件路径,%~nx1只取文件名加扩展名,copy /y跳过覆盖确认,>nul屏蔽复制提示。这条封装的价值不在技术含量,而在于它把“误改原文件”这个风险从流程上掐掉了。
第二个封装负责归一化,用在“别人发来的文件打开是一整行”这种场景。思路是先转成 CRLF 再打开,转换脚本在 4.2 节给完整实现,这里只演示调用方式:
@echo off setlocal rem 先把 LF 统一转成 CRLF,再交给编辑器打开 python "%~dp0tools\fix_eol.py" --to crlf --in "%~1" --out "%~dp0tmp\norm_%~nx1" start "" "%~dp0notepad.exe" "%~dp0tmp\norm_%~nx1" endlocal两个封装放在同一个目录里,用不同的文件名区分:一个叫“只读查看.bat”,一个叫“归一化打开.bat”。这种命名看着土,但在维护盘那种目录里,隔三个月再回来看,你能一眼知道该点哪个。
3.3 右键“用记事本打开”:可加也要可撤
便携工具最大的便利是右键直接打开,最大的麻烦是留下的注册项撤不干净。原则很简单:加注册和撤注册必须成对写,放在同一个目录里,文件名上就写明用途。
加右键菜单的脚本:
@echo off setlocal set "EXE=%~dp0notepad.exe" rem 菜单位置与显示名 reg add "HKCU\Software\Classes\*\shell\PortableNotepad" /ve /d "用便携记事本打开" /f reg add "HKCU\Software\Classes\*\shell\PortableNotepad" /v "Icon" /d "\"%EXE%\",0" /f rem 实际执行的命令;bat 里 %1 要写成 %%1,注册表里落的是 %1 reg add "HKCU\Software\Classes\*\shell\PortableNotepad\command" /ve /d "\"%EXE%\" \"%%1\"" /f echo 已注册右键菜单撤销脚本就一行有效命令:
@echo off reg delete "HKCU\Software\Classes\*\shell\PortableNotepad" /f echo 已清理右键菜单这里用HKCU而不是HKLM,好处是不需要管理员权限,在当前用户下加了就生效,删了也干净,不会影响同机器的其他账户。代价是路径写死成了绝对路径——%~dp0展开后是具体盘符和目录,一旦 U 盘换了盘符,右键菜单就是一个指向空处的死链,点了没反应,也不报错。
处理办法有两种:一是用完即撤,离开那台机器前跑一遍撤销脚本;二是每次插盘后先跑一遍注册脚本,把路径刷新成当前盘符。我倾向第一种,因为便携工具的核心承诺就是“不留痕”,留一个会失效的右键菜单,本质上是在给自己挖坑。
提示:注册脚本和撤销脚本放在同一个目录,命名成“注册右键.bat”和“撤销右键.bat”,并且在 readme 里写清楚先跑哪个。维护盘上的东西,三个月后你自己都不记得顺序。
4. 编码、换行、大文件:记事本类工具的三个硬边界
前面两章讲的是可控的部分,这一章讲不可控的部分。文本编辑这件事看起来简单,真正让人翻车的永远是三个老问题:编码认错、换行符不认、文件大到卡死。这三个边界不解决,工具再便携也没用。
4.1 UTF-8 带不带 BOM,决定了别人打开是中文还是方框
BOM 是字节序标记,在 UTF-8 里表现为文件头的三个字节EF BB BF。它的历史使命是给 UTF-16/UTF-32 标明字节序,UTF-8 本身不需要,但很多老实现还是会写。问题在于,不同工具对这三个字节的态度完全不一样:有的会吃掉它,有的会把它当成正文内容。
| 文件头字节 | 含义 | 常见误判后果 |
|---|---|---|
EF BB BF | UTF-8 带 BOM | JSON 解析报首行异常、脚本首行 shebang 失效 |
FF FE | UTF-16 小端 | 被当成二进制或乱码 |
FE FF | UTF-16 大端 | 同上 |
| 无 BOM | 编码未声明 | 中文被按 ANSI 打开变乱码 |
最典型的翻车场景是配置文件和脚本。一个带 BOM 的 JSON,人眼看着完全正常,解析器却在第一个字符位置报错,因为那三个字节不在 JSON 语法里。同理,带 BOM 的 shell 脚本第一行会被当成奇怪的东西,执行时报“找不到解释器”。这类问题的排查成本极高,因为报错信息和真实原因差得远,属于典型的黑匣子。
检测办法很直接,看文件头四个字节就行:
# 输出文件头部若干字节,用来判断有无 BOM Format-Hex -Path .\config.ini -Count 4输出里EF BB BF开头就是 UTF-8 带 BOM,FF FE是 UTF-16 小端,其余情况基本可以认为是无 BOM。这个命令我几乎是条件反射地用,尤其接手别人发的配置文件时,先看一眼再打开,能省掉很多“明明内容一样为什么就是不生效”的困惑。
处理原则:面向机器读的文件(配置、脚本、数据)一律存无 BOM 的 UTF-8;面向人看、尤其是要给老版本表格软件打开的文件,才考虑带 BOM。这条规则写进团队规范比事后排查便宜得多。
4.2 CRLF / LF 批量互转的脚本
换行符是比 BOM 更高频的坑。CRLF 是两个字节0D 0A,LF 是一个字节0A,CR 是一个字节0D。老版本的记事本只认 CRLF,拿到一个纯 LF 的文件,整个文件会显示成一整行,横向滚动条拉到天边。这个问题在跨平台协作里几乎天天出现。
手工另存为能解决单个文件,但批量处理必须上脚本。下面这个脚本做了三件事:探测 BOM 决定用哪种编码读、把三种换行统一归一再按目标格式写出、输出到指定目录不覆盖源文件。
from pathlib import Path import argparse BOMS = [ (b"\xef\xbb\xbf", "utf-8-sig"), (b"\xff\xfe", "utf-16-le"), (b"\xfe\xff", "utf-16-be"), ] def sniff_encoding(path: Path) -> str: """先看 BOM;没有 BOM 就按 UTF-8 试,失败退回本地编码""" head = path.open("rb").read(4) for bom, enc in BOMS: if head.startswith(bom): return enc try: path.read_bytes().decode("utf-8") return "utf-8" except UnicodeDecodeError: return "gb18030" def convert(src: Path, dst: Path, target_enc: str, newline: str) -> None: enc = sniff_encoding(src) text = src.read_bytes().decode(enc) # 先把三种换行统一成 LF,再按目标格式重新拼 text = text.replace("\r\n", "\n").replace("\r", "\n") if newline == "crlf": text = text.replace("\n", "\r\n") elif newline == "cr": text = text.replace("\n", "\r") # newline="" 很关键:关掉写入时的自动换行转换,否则 CRLF 会被写成 CRCRLF dst.parent.mkdir(parents=True, exist_ok=True) with dst.open("w", encoding=target_enc, newline="") as f: f.write(text) if __name__ == "__main__": ap = argparse.ArgumentParser() ap.add_argument("--in", dest="src", required=True) ap.add_argument("--out", dest="dst", required=True) ap.add_argument("--to", choices=["crlf", "lf", "cr"], default="crlf") ap.add_argument("--enc", default="utf-8") args = ap.parse_args() convert(Path(args.src), Path(args.dst), args.enc, args.to)几个参数必须解释清楚。sniff_encoding里的顺序不能反,先判 BOM 再试解码,因为 UTF-16 文件按 UTF-8 硬解通常不报错但会得到一堆乱码,看着能读,实际全错。gb18030作为兜底编码,覆盖面比gbk广,兼容性更好。newline=""是最容易漏的一行——把它去掉,Python 会在写入时自动把\n转成系统默认的换行,你手动拼的 CRLF 就变成了 CRCRLF,文件更大,且在某些解析器里会出现空行。
调用方式在 3.2 节已经给过,--to crlf处理“打开是一整行”的问题,--to lf处理“提交到版本库后整文件 diff”的问题,--enc utf-8-sig则用于必须带 BOM 的场景。
4.3 多大算大:体积与超长行的实际阈值
记事本类工具的性能拐点,跟文件体积有关,但更跟单行长度有关。一份 50 MB 但每行都很短、结构规整的日志,打开和滚动都还行;一份只有 2 MB 但整篇是一行的压缩 JSON,打开就能让界面失去响应。原因是渲染层要计算一整行的排版宽度,行越长,计算量越是爆炸式增长。
下面这张表是常见经验值,具体机器会有差异,但量级可以参考:
| 文件规模 | 典型表现 | 建议做法 |
|---|---|---|
| 1 MB 以内 | 秒开,滚动流畅 | 随便用 |
| 1~20 MB | 打开 1~3 秒,滚动略有停顿 | 关自动换行,关行号 |
| 20~100 MB | 明显卡顿,搜索很慢 | 换流式查看工具,或直接命令行过滤 |
| 100 MB 以上 | 经常无响应 | 不要用图形界面记事本 |
| 单行超过 1 万字符 | 横向滚动卡死 | 先格式化成多行再看 |
对应的实操动作:看大日志先关自动换行,这一项对性能影响最大;确认不需要编辑时,用只读方式打开;实在太大就别硬撑,findstr或者流式查看工具才是对的工具。把记事本当万能查看器用,最后卡住的只会是你自己。
注意:对超大文件做“另存为”是最危险的操作之一,容易在写入过程中失败,留下一个半截文件。真要改,先复制一份出来改,别在原文件上动手。
5. 避坑与排查:五个翻车现场的现象、原因与解法
这一章全是踩过的坑。每一条我按“看到什么现象 → 为什么 → 怎么解决”写,方便你按现象直接对号入座。
5.1 启动、权限与介质相关
坑一:双击没反应,或者一闪就没了。
现象是双击 exe 或 bat,窗口闪一下就消失,看不到任何提示,任务管理器里也没有残留进程。
原因是程序在压缩包里被直接双击了。很多压缩工具会把包内文件解压到系统临时目录再执行,而临时目录路径带随机串、权限受限,程序一启动就想在“自己所在目录”旁边建配置目录,建不了就直接退出。另一个常见原因是文件带着“来自网络”的标记,被安全策略拦了。
解决方法是完整解压到本地或 U 盘的一个固定目录,不要在压缩软件里直接运行。如果确认已经解压还是被拦,解除单个文件的锁定标记:
# 解除单个文件的网络来源标记 Unblock-File -Path .\notepad.exe这条命令的作用是去掉文件附带的来源信息,不改内容、不改权限。批量处理时把路径换成目录加通配符即可。
坑二:设置改完,第二天又变回默认。
现象是辛辛苦苦把字体、编码、换行都调好,关机重开或者换台机器,全部回到出厂状态。
原因是配置写到了程序目录之外。可能是启动脚本没生效(比如你直接双击了 exe 而没走 bat),也可能是这个版本压根不支持目录内配置,只认用户配置目录。前面 2.2 节那个“看目录里哪些文件被改过”的命令,就是专门用来确认这一点的。
解决办法是先跑一次探测,确认配置文件落在哪;如果确认在用户目录,就改用 2.3 的启动脚本启动,并且从此固定走 bat,不要再直接点 exe。习惯上的调整比技术上的调整更重要。
坑三:在只读介质上一切正常,就是存不了盘。
现象是打开、浏览、搜索都没问题,一保存就报错,或者提示“拒绝访问”。用 U 盘写保护开关、或者把文件放在只读共享目录里,都会触发。
原因是目标路径不可写。程序本身没毛病,是文件系统不允许。这个坑最容易被误判成“这个便携版有问题”。
解决办法是把要改的文件先复制到可写目录再改,改完再拷回去。如果经常这么干,就按 3.2 节那个“只读查看”的封装来,从流程上默认复制,省得每次都手动。
5.2 编码与显示相关
坑四:中文全变方框或者乱码。
现象是英文正常,中文显示成方块、问号或者一串看不懂的字符。
原因有两个层面。显示层面的原因是当前字体不含中文字形,程序静默回退到了一个没有中文覆盖的字体上;内容层面的原因是文件是无 BOM 的 UTF-8,被按本地编码打开了,字节被错误解读。
解决顺序是先从状态栏确认程序识别到的编码,如果不是 UTF-8,用“另存为”显式选一次正确编码,再重新打开验证。如果编码对了还是方块,那就是字体问题,去配置里换一个带中文覆盖的字体。判断到底是哪一层的问题,看一个特征就够了:编码错的时候,标点符号也会错位;字体缺字的时候,只有特定字符是方块,标点和英文都正常。
坑五:右键菜单加了撤不掉,或者点了没反应。
现象是右键菜单里多了一项,点了没反应;或者换了台机器、换了盘符,那一项还在,但指向的路径已经不存在了。
原因是注册表里存的是绝对路径,盘符一变就成死链。而且如果只写了注册脚本没写撤销脚本,这个死链会一直挂着,越积越多。
解决办法分两步:先跑撤销脚本把残留清掉,命令就是 3.3 节那行reg delete;然后改习惯,便携工具用完就撤,别指望“下次还能用”。真要长期挂着,就把注册动作放进插盘后的第一个脚本里,每次刷新路径。
提示:排查这类问题时,先分清楚是“程序问题”还是“环境问题”。判据很简单——换一台干净的机器,同样的目录、同样的操作,如果正常,那就是原机器环境的问题,别在程序上耗时间。
6. 进阶用法:把便携记事本塞进维护盘和批处理流程
维护盘的目录约定比工具本身重要。我一般按“程序 / 配置 / 临时 / 脚本”四层来分,顶层只放一个入口 bat,所有具体路径都写在脚本里。这样做的原因很实际:维护盘经常在别人的机器上插拔,盘符每次都不一样,任何写死盘符的快捷方式都会失效,而用%~dp0的相对定位永远指向脚本自己所在目录,盘符变了也不影响。
只读介质要单独处理。如果维护盘开了写保护,配置目录建不出来,程序启动时可能直接失败。我的做法是在入口脚本里先做一次可写探测,探测不通过就把配置目录和临时目录整体指向本机临时区:
@echo off setlocal set "APP_DIR=%~dp0" rem 先探测程序目录是否可写,写不了就退到本机临时区 set "CFG_DIR=%APP_DIR%config" if not exist "%CFG_DIR%" mkdir "%CFG_DIR%" 2>nul if not exist "%CFG_DIR%" set "CFG_DIR=%TEMP%\portable_np" set "APPDATA=%CFG_DIR%" set "LOCALAPPDATA=%CFG_DIR%" set "TEMP=%CFG_DIR%\tmp" if not exist "%TEMP%" mkdir "%TEMP%" start "" "%APP_DIR%notepad.exe" %* endlocal关键在mkdir ... 2>nul后面那一句判断:目录建不出来时CFG_DIR会重新赋值,后面所有变量都跟着走,逻辑上只有一条分支,维护起来简单。注意这种降级模式下配置是临时的,关机就没了,这是刻意的取舍——只读介质本来就存不住状态,与其失败,不如降级跑起来。
批量处理这块,最有用的是把 4.2 那个转换脚本包一层目录级入口,一次处理一整个文件夹。实际用起来是这样:接手一个别人发来的配置目录,先整体跑一遍统一成 CRLF 加无 BOM 的 UTF-8,再逐个人工确认。这一步能省掉大量“这个文件打开是一行、那个文件中文乱码”的零碎确认。
我现在的习惯是,任何要流出去的文本文件,在交付前都强制走一遍编码和换行检查,不管对方说得多随便。这个习惯是被坑出来的:早期给一台老机器改配置,本地看着一切正常,对方打开是一整行,来回折腾了半天才发现是换行符,尴尬得很。从那以后,检查脚本必须先跑,再谈别的。
这套东西不复杂,核心就三点:状态跟着目录走、编码和换行显式指定、注册动作可撤销。把这三件事做扎实,一个几十兆都不到的便携目录,能顶掉很多来回折腾的时间。希望对你有用,希望帮到你。
本文还有配套的精品资源,点击获取