惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Project Zero
Project Zero
月光博客
月光博客
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
O
OpenAI News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Know Your Adversary
Know Your Adversary
Last Week in AI
Last Week in AI
S
Securelist
Engineering at Meta
Engineering at Meta
博客园 - 司徒正美
P
Privacy & Cybersecurity Law Blog
T
Tailwind CSS Blog
F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
Scott Helme
Scott Helme
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
云风的 BLOG
云风的 BLOG
C
Cisco Blogs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
小众软件
小众软件
U
Unit 42
Microsoft Azure Blog
Microsoft Azure Blog
Hacker News: Ask HN
Hacker News: Ask HN
Hugging Face - Blog
Hugging Face - Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
SecWiki News
SecWiki News
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hackread – Cybersecurity News, Data Breaches, AI and More
L
Lohrmann on Cybersecurity
IT之家
IT之家
Security Archives - TechRepublic
Security Archives - TechRepublic
I
InfoQ
S
Security @ Cisco Blogs
Webroot Blog
Webroot Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
F
Full Disclosure
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The GitHub Blog
The GitHub Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Jina AI
Jina AI
Cyberwarzone
Cyberwarzone
人人都是产品经理
人人都是产品经理
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
B
Blog RSS Feed
Apple Machine Learning Research
Apple Machine Learning Research

博客园 - 立体风

github上关于CMD高级命令知识 brainstorming SKILL技能完整中文翻译版 更新 claude code 官方插件市场 Sigmoid 函数的数学起源与定义详解 路径在powershell 配置文件 Profile 和 环境变量 PATH 的区别 当AI构建自身 nana gui库的回调函数 Nana c++ gui库的对话框函数 -- 理解 nana 的运行机制 介绍 MSVC 的编译命令/ Zc CMake 变量 ${CMAKE_CURRENT_BINARY_DIR} 学习 nana c++ 库 (一) AutoHotkey v2 的源码学习路线 Visual Studio 中行号右边的黄色竖条 大O表示法推导 allocate 中为什么有两个L vs的cl.exe 编译器 c++20 基本配置 IT高频词 address Python Install Manager (PIM,官方安装管理器)简介 debian 中 contrib 软件仓库 debian 版本号及 apt 命令对软件的区分 sysctl的历史及常用命令 极限运算的法则 TeX 的 ctex 宏包的基本用法 XeLaTeX 的基本用法 XeLaTeX 介绍 为什么梯度向量 ∇f 指向函数值增长最快的方向 三角函数的余弦定理的证明 向量点积的几何定义的证明 方向导数公式的证明 仿射函数的定义及用途 凸集的定义及证明 在 LaTeX 公式中处理英文单词 梯度下降法 (Gradient Descent)的数学原理。 梯度下降法简介 向量形式表达最小二乘法 线性回归模型的核心数学表达式 risidual 音标和本义 coefficients的音标及本义(线性模型)
CMD命令启动模板
立体风 · 2026-07-25 · via 博客园 - 立体风

这是一个可以直接复用的 CMD 启动脚本模板,专为 Node.js 全局 CLI 工具设计。你只需要替换底部的可执行文件路径即可。

📝 通用启动脚本模板

@ECHO off
GOTO start
:find_dp0
SET dp0=%~dp0
EXIT /b
:start
SETLOCAL
CALL :find_dp0

REM ==================== 配置区域 ====================
REM 修改下方路径为你的实际可执行文件路径
REM 路径相对于当前 .bat 文件所在目录
SET "TARGET_EXE=%dp0%node_modules\your-package\bin\your-cli.exe"
REM ================================================

IF NOT EXIST "%TARGET_EXE%" (
    ECHO 错误: 找不到目标程序 "%TARGET_EXE%"
    ECHO 请检查路径是否正确,或确认依赖已安装。
    EXIT /b 1
)

"%TARGET_EXE%" %*

🔧 自定义指南

需要修改的内容 说明 示例
TARGET_EXE 可执行文件的相对路径 %dp0%dist\cli.js%dp0%bin\app.exe
错误提示文本 根据实际项目修改提示信息 ECHO 请先运行 npm install
退出码 非零值表示异常退出 EXIT /b 1

💡 模板设计要点

  • 路径安全SET "TARGET_EXE=..." 使用引号包裹整个赋值语句,避免路径中的空格导致变量解析错误。
  • 健壮性检查IF NOT EXIST 在启动前验证文件是否存在,避免静默失败,给用户明确的错误提示。
  • 参数透传%* 确保所有命令行参数(包括带空格的参数)原样传递给目标程序。
  • 环境隔离SETLOCAL 保证 dp0TARGET_EXE 不会泄露到全局环境。
  • 子过程模式GOTO start + CALL :find_dp0 的组合确保 %~dp0 始终返回 .bat 文件自身的绝对路径,不受调用方式影响。

⚠️ 注意事项

  • 如果目标程序是 .js 文件而非 .exe,需要将启动命令改为 node "%TARGET_EXE%" %*
  • 如果项目使用 package.jsonbin 字段,路径通常位于 node_modules\.bin\ 目录下,而非 node_modules\your-package\bin\
  • 此模板适用于 Windows CMD 环境。如果项目需要同时支持 PowerShell,建议额外创建一个 .ps1 包装脚本。

一个具体的例子

这段脚本是 Node.js 生态中 CLI 工具(特别是 Claude Code)非常典型的 Windows 启动包装器。它的核心使命只有一个:精准定位当前脚本所在的绝对路径,并以此启动同目录下的 Node.js 可执行文件

下面逐行拆解它的执行逻辑:

📜 逐行解读

@ECHO off
GOTO start
:find_dp0
SET dp0=%~dp0
EXIT /b
:start
SETLOCAL
CALL :find_dp0
"%dp0%\node_modules\@anthropic-ai\claude-code\bin\claude.exe" %*

@ECHO off

  • 作用:关闭命令回显。
  • 解读@ 表示连 ECHO off 这条命令本身也不显示。这样脚本运行时,终端只会显示执行结果,不会刷屏显示每一行命令,让输出更干净。

GOTO start

  • 作用:无条件跳转到 :start 标签处。
  • 解读:这是脚本的核心技巧。它故意跳过了下方的 :find_dp0 代码块,确保 SET dp0=%~dp0 只在被 CALL 调用时才执行,而不是在脚本初始化时执行。

:find_dp0

  • 作用:定义一个名为 find_dp0 的子过程/标签。
  • 解读:在 CMD 中,标签(以 : 开头)既可以作为 GOTO 的跳转目标,也可以作为 CALL 调用的子过程入口。

SET dp0=%~dp0

  • 作用:获取当前批处理文件的绝对目录路径
  • 解读:这是整段脚本的灵魂
    • %0:代表当前正在执行的批处理文件本身。
    • %~dp0:是 CMD 的参数扩展修饰符d 代表驱动器号(Drive),p 代表路径(Path)。
    • 无论用户从哪个目录、用什么方式(绝对路径、相对路径、PATH 环境变量)运行此脚本,%~dp0 永远返回该 .bat 文件所在的完整绝对路径(例如 C:\Users\Name\AppData\Roaming\npm\)。
    • 这解决了“相对路径在不同工作目录下失效”的经典问题。

EXIT /b

  • 作用:退出当前子过程,返回调用者。
  • 解读/b 参数至关重要。它表示仅退出当前子过程,而不是退出整个 CMD 进程。如果省略 /b,脚本执行到这里就会直接关闭终端窗口。

SETLOCAL

  • 作用:开启局部环境变量作用域。
  • 解读:在此命令之后设置的所有变量(如 dp0)都是临时的。当脚本执行到末尾(或遇到 ENDLOCAL)时,这些变量会自动销毁,不会污染用户的全局 CMD 环境。这是一种良好的编程习惯。

CALL :find_dp0

  • 作用:调用 :find_dp0 子过程。
  • 解读:此时脚本才会真正执行 SET dp0=%~dp0,将当前脚本的绝对目录存入 dp0 变量,然后 EXIT /b 返回到这一行继续向下执行。

"%dp0%\node_modules\@anthropic-ai\claude-code\bin\claude.exe" %*

  • 作用:启动目标程序并传递所有参数。
  • 解读
    • "%dp0%\...":利用之前获取的绝对路径,拼接出 claude.exe 的完整路径。外层引号是为了防止路径中包含空格(如 C:\Program Files\)导致命令解析错误。
    • %*:代表传递给当前批处理文件的所有参数。这意味着用户在 CMD 中输入的 claude helpclaude --version 等所有参数,都会被原封不动地透传给真正的 claude.exe

💡 为什么需要这么写?

你可能会问:为什么不直接写 node_modules\@anthropic-ai\claude-code\bin\claude.exe

场景 直接写相对路径 使用 %~dp0
用户在脚本所在目录运行 ✅ 正常 ✅ 正常
用户在其他目录通过绝对路径运行 ❌ 找不到文件 ✅ 正常
用户通过 PATH 环境变量运行 ❌ 找不到文件 ✅ 正常
路径中包含空格 ❌ 可能解析错误 ✅ 引号保护,正常

总结:这段脚本是一个路径无关的启动器。它确保了无论用户从何处、以何种方式调用 claude 命令,都能准确无误地找到并执行安装在 node_modules 中的二进制文件,同时保持环境变量的整洁。

注意:这是 Node.js 通过 npm install -g 全局安装 CLI 工具时,npm 自动生成的 .cmd 包装脚本的标准模板。如果你自己编写类似的启动脚本,可以直接复用这个模式。

一个具体例子解读

这段脚本是 Node.js 生态中 CLI 工具(特别是 Claude Code)非常典型的 Windows 启动包装器。它的核心使命只有一个:精准定位当前脚本所在的绝对路径,并以此启动同目录下的 Node.js 可执行文件

下面逐行拆解它的执行逻辑:

📜 逐行解读

@ECHO off
GOTO start
:find_dp0
SET dp0=%~dp0
EXIT /b
:start
SETLOCAL
CALL :find_dp0
"%dp0%\node_modules\@anthropic-ai\claude-code\bin\claude.exe" %*

@ECHO off

  • 作用:关闭命令回显。
  • 解读@ 表示连 ECHO off 这条命令本身也不显示。这样脚本运行时,终端只会显示执行结果,不会刷屏显示每一行命令,让输出更干净。

GOTO start

  • 作用:无条件跳转到 :start 标签处。
  • 解读:这是脚本的核心技巧。它故意跳过了下方的 :find_dp0 代码块,确保 SET dp0=%~dp0 只在被 CALL 调用时才执行,而不是在脚本初始化时执行。

:find_dp0

  • 作用:定义一个名为 find_dp0 的子过程/标签。
  • 解读:在 CMD 中,标签(以 : 开头)既可以作为 GOTO 的跳转目标,也可以作为 CALL 调用的子过程入口。

SET dp0=%~dp0

  • 作用:获取当前批处理文件的绝对目录路径
  • 解读:这是整段脚本的灵魂
    • %0:代表当前正在执行的批处理文件本身。
    • %~dp0:是 CMD 的参数扩展修饰符d 代表驱动器号(Drive),p 代表路径(Path)。
    • 无论用户从哪个目录、用什么方式(绝对路径、相对路径、PATH 环境变量)运行此脚本,%~dp0 永远返回该 .bat 文件所在的完整绝对路径(例如 C:\Users\Name\AppData\Roaming\npm\)。
    • 这解决了“相对路径在不同工作目录下失效”的经典问题。

EXIT /b

  • 作用:退出当前子过程,返回调用者。
  • 解读/b 参数至关重要。它表示仅退出当前子过程,而不是退出整个 CMD 进程。如果省略 /b,脚本执行到这里就会直接关闭终端窗口。

SETLOCAL

  • 作用:开启局部环境变量作用域。
  • 解读:在此命令之后设置的所有变量(如 dp0)都是临时的。当脚本执行到末尾(或遇到 ENDLOCAL)时,这些变量会自动销毁,不会污染用户的全局 CMD 环境。这是一种良好的编程习惯。

CALL :find_dp0

  • 作用:调用 :find_dp0 子过程。
  • 解读:此时脚本才会真正执行 SET dp0=%~dp0,将当前脚本的绝对目录存入 dp0 变量,然后 EXIT /b 返回到这一行继续向下执行。

"%dp0%\node_modules\@anthropic-ai\claude-code\bin\claude.exe" %*

  • 作用:启动目标程序并传递所有参数。
  • 解读
    • "%dp0%\...":利用之前获取的绝对路径,拼接出 claude.exe 的完整路径。外层引号是为了防止路径中包含空格(如 C:\Program Files\)导致命令解析错误。
    • %*:代表传递给当前批处理文件的所有参数。这意味着用户在 CMD 中输入的 claude helpclaude --version 等所有参数,都会被原封不动地透传给真正的 claude.exe

💡 为什么需要这么写?

你可能会问:为什么不直接写 node_modules\@anthropic-ai\claude-code\bin\claude.exe

场景 直接写相对路径 使用 %~dp0
用户在脚本所在目录运行 ✅ 正常 ✅ 正常
用户在其他目录通过绝对路径运行 ❌ 找不到文件 ✅ 正常
用户通过 PATH 环境变量运行 ❌ 找不到文件 ✅ 正常
路径中包含空格 ❌ 可能解析错误 ✅ 引号保护,正常

总结:这段脚本是一个路径无关的启动器。它确保了无论用户从何处、以何种方式调用 claude 命令,都能准确无误地找到并执行安装在 node_modules 中的二进制文件,同时保持环境变量的整洁。

注意:这是 Node.js 通过 npm install -g 全局安装 CLI 工具时,npm 自动生成的 .cmd 包装脚本的标准模板。如果你自己编写类似的启动脚本,可以直接复用这个模式。