簡體   English   中英

如何從父批處理文件運行但未調用的另一個批處理文件中查找父批處理文件的名稱/路徑?

[英]How to find the name/path of a parent batch file from within another batch file RUN, but not CALLed, by the parent?

我的目標是擁有一個通用批處理文件,該文件能夠從另一個批處理文件中按名稱運行,然后該批處理文件將對運行它的父批處理文件執行元/內省操作。 為了做到這一點,我希望我可以從我的通用文件中識別父級。 我知道我可以在父級運行我的文件時將父級的名稱/路徑作為參數與命令一起提供,但為了防止父級文件的不誠實報告,出於美學原因,也是為了探索功能一般來說,我想避免這樣做,如果可能的話,讓所有的識別都由我的腳本來完成。

我查看了WMIC ,並且確定我可以在腳本運行時獲取腳本的 cmd.exe 實例的ParentProcessID ,但我還沒有找到對它做任何有用的事情的方法。 我搞砸了(goto)把戲,我知道如果父級調用我的腳本如何獲取父級的名稱/路徑,但是因為我正在嘗試運行它(即通過它的裸名作為命令) , (goto)把戲也沒有給我帶來任何好處,因為它似乎都是一個調用堆棧。

盡管任何弄亂批處理的人都應該已經知道我在說這些話時嘗試了什么,但為了使這篇文章的內容變得模糊,下面是我將如何使用(goto)技巧來檢查對調用堆棧的更改:

@ECHO OFF
:: TOPLEVEL.BAT, note I'm not calling my script
"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

  :: define variable that will be blank while still in nested scope
  CALL SET "_COMPLETE_=%%"

  IF NOT DEFINED _COMPLETE_ (
    :: go one scope deeper and recurse
    CALL "%_SELF_%"

  ) ELSE (
    :: back to baseline
    CALL "%ComSpec%" /c
  )
)
ENDLOCAL

無論如何,那里的任何向導都知道這是否可能或如何完成?

鏈接批處理文件時,以前的鏈中可用的信息很少。
但是有變量 %cmdcmdline%。 根據第一個批處理文件的啟動方式,此變量可能包含第一個啟動的批處理文件的名稱。 如果從命令行手動啟動它沒有有用的信息,但可以靜默更改為使用 cmd/c 運行(請參閱 chain0.cmd)。 如果使用start命令啟動或從資源管理器啟動或使用cmd/c從命令行啟動,它將在 %cmdcmdline% 中包含第一個啟動的批處理文件的名稱。

鏈條0.cmd

@echo off
cls
echo this is: %~0
echo cmdcmdline=[%cmdcmdline%]

if "%comspec%" == %cmdcmdline% cmd /c %0 & exit /b

Chain1.cmd

鏈1.cmd

@echo off
echo this is: %~0
echo cmdcmdline=[%cmdcmdline%]

Chain2.cmd

Chain2.cmd

@echo off
echo this is: %~0
echo cmdcmdline=[%cmdcmdline%]

pause

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM