nppexec多行脚本需按顺序编写指令,以npp_save开头确保保存最新文件,用$(ext_part)判断扩展名并配合goto跳转,路径含空格时须用双引号包裹完整解释器路径,末尾加& pause或npp_console 1 | python -u "$(full_current_path)"保持输出。

怎么用NppExec写多行命令脚本而不是单条执行
单条命令(比如python "$(FULL_CURRENT_PATH)")适合临时测试,但真正写脚本时必须用多行逻辑——否则没法保存、没法判断扩展名、没法自动切工作目录。NppExec 的脚本不是 Bash 或 Python,它有自己的语法:每行一条指令,靠 GOTO 跳转,靠 if 判断,靠变量展开路径。
关键点是:所有命令必须按顺序写在 NppExec 控制台输入框里,或保存为命名脚本(通过 Plugins → NppExec → Advanced Options → Save),不能直接粘贴进编辑器文件里运行。
-
NPP_SAVE必须放在第一行——它强制保存当前文件,否则你改了代码却运行旧版本 - 路径变量如
$(FULL_CURRENT_PATH)只在NPP_SAVE之后才更新,写在前面等于空值 - 条件判断只支持
==和字符串字面量,不支持正则或大小写忽略,.py和.PY是两个不同分支 - 跳转标签必须独占一行,且以冒号开头,比如
:PYTHON,后面不能跟空格或注释
为什么写了 if 判断却总走到 :OTHER 分支
最常见原因是 $(EXT_PART) 值为空或带空格——比如文件没后缀、名字末尾有空格、或者用了隐藏字符(如零宽空格)。NppExec 不做 trim,也不自动小写化。
调试方法很简单:在判断前加一行 echo EXT is "$(EXT_PART)",看控制台输出到底是什么。你会发现实际可能是 ".py "(带空格)或 ".PY"(大写)。
- 确保文件真实有后缀,Notepad++ 里右下角状态栏显示的
Python不代表磁盘上就是.py - 不要依赖系统默认关联来“猜”后缀,
$(EXT_PART)只读取文件名最后一段点号之后的内容 - 如果想兼容大小写,得手动写两遍判断:
if "$(EXT_PART)" == ".py" GOTO PYTHON和if "$(EXT_PART)" == ".PY" GOTO PYTHON - 空扩展名(如
script没点)会让$(EXT_PART)为空字符串,此时if "" == ".py"永远不成立
多行脚本里怎么安全调用含空格的 Python 路径
当 Python 安装在 C:\Program Files\Python311\python.exe 这类路径时,直接写 python "$(FULL_CURRENT_PATH)" 会失败——因为 CMD 把 python 当成命令名,而 C:\Program 被截断为第一段。
必须显式写出完整路径,并用英文双引号包裹整个解释器路径,再单独包裹脚本路径:
cd "$(CURRENT_DIRECTORY)" "C:\Program Files\Python311\python.exe" "$(FULL_CURRENT_PATH)" & pause
- 注意:
&是 CMD 的命令分隔符,不是 & 符号本身;NppExec 里要写成&才能正确解析 - 别用
py -3替代——它不保证调用你期望的 Python 版本,且 NppExec 不解析 shebang - 如果路径里有括号(如
(x64)),也必须加引号,否则 CMD 解析失败 - 推荐用
where python在 CMD 中确认实际路径,再复制过来,避免手输错误
执行完 Python 脚本后控制台一闪就关,怎么留住输出
这不是 Python 问题,是 NppExec 默认不保持控制台窗口。即使脚本里有 input(),也可能卡住不动——因为 stdin 没被正确连接,或者缓冲没刷新。
- 最简单办法:命令末尾加
& pause,比如python "$(FULL_CURRENT_PATH)" & pause - 更干净的做法是启用内置控制台:
npp_console 1 | python -u "$(FULL_CURRENT_PATH)",其中-u强制无缓冲,避免 print 卡住 - 如果用了
chcp 65001切 UTF-8 编码,一定要放在python命令之前,且用&&连接:cmd /c chcp 65001 >nul && python -u "$(FULL_CURRENT_PATH)" - 别指望
print("done")后自动停住——Python 脚本退出即控制台关闭,除非你显式阻塞或 NppExec 保持窗口
多行脚本里最容易被忽略的,是 NPP_SAVE 和路径变量的时序关系。很多人把 cd 放最前,结果 $(CURRENT_DIRECTORY) 还是旧值;或者漏掉 NPP_SAVE,改完代码却运行上一版。这些不是配置问题,是执行模型的理解偏差。











