You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从被RUN而非CALL的子批处理中获取父批处理的路径/名称?

如何在直接运行的批处理中自动识别父批处理文件?

我希望制作一个通用批处理文件,可被其他批处理文件通过**直接运行(RUN)**的方式调用,之后能对运行它的父批处理文件进行元操作/自省。为实现此功能,需在通用批处理内识别父文件。我知道可在父文件运行通用批处理时将自身名称/路径作为参数传入,但为避免父文件提供不实信息、追求美观,同时探索批处理功能,希望由脚本自行完成识别,无需传参。

我已尝试过以下方法,但均未达到预期效果:

  • 研究过WMIC:可获取脚本运行时cmd.exe实例的ParentProcessID,但不知如何有效利用;
  • 试过(goto)技巧:该技巧在父文件用CALL调用子脚本时可获取父文件信息,但由于我使用RUN方式运行,(goto)技巧无法生效,因为两者似乎处于同一调用栈。

以下是我用(goto)技巧检查调用栈变化的测试代码:

TOPLEVEL.BAT(父批处理)

@ECHO OFF
:: TOPLEVEL.BAT, 注意这里没有用CALL调用脚本
"MYSCRIPT.BAT"

MYSCRIPT.BAT(通用批处理)

@ECHO OFF
:: MYSCRIPT.BAT
SETLOCAL
SET "_SELF_=%~dpnx0"
(
  (goto) 2>NUL
  ECHO this is the scope I should be in: %~dpnx0
  CALL ECHO this is the scope I would break into: %%~dpnx0
  (goto) 2>NUL

  :: 定义一个在嵌套作用域中为空的变量
  CALL SET "_COMPLETE_=%%"

  IF NOT DEFINED _COMPLETE_ (
    :: 深入一层作用域并递归
    CALL "%_SELF_%"

  ) ELSE (
    :: 返回基线
    CALL "%ComSpec%" /c
  )
)
ENDLOCAL

请问是否有办法实现此需求?


内容的提问来源于stack exchange,提问作者Sandy Clams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:00:34