Batch file 通过目录的CMD脚本获取绝对路径
正在调用的脚本。cmd:Batch file 通过目录的CMD脚本获取绝对路径,batch-file,cmd,Batch File,Cmd,正在调用的脚本。cmd: REM This is my script file, it is being invoked from anywhere REM Get absolute path to root directory set astr=%~dp0 set substr1=\mq_1.7.6\interface\ set substr2=\ call set rootPath=%%astr:%substr1%=%substr2%%% 我试图从接口目录中调用的文件中获取下面几个路径中的
REM This is my script file, it is being invoked from anywhere
REM Get absolute path to root directory
set astr=%~dp0
set substr1=\mq_1.7.6\interface\
set substr2=\
call set rootPath=%%astr:%substr1%=%substr2%%%
我试图从
接口
目录中调用的文件中获取下面几个路径中的绝对目录路径。然而,问题是上面代码中的路径发生了变化。mq_1.7.6
中的版本可能会更改。是否仍然可以通过cmd脚本获取此值?我本来会做\..\
,但这在Windows中似乎不起作用。我通常使用~fi
扩展模式来做这件事。不幸的是,这只能在for
循环中使用(至少据我所知)
set "parentdir=%~dp0.."
for %%i in ("%parentdir%") do set "realparent=%%~fi"
echo "%parentdir%"
echo "%realparent%"
如果上述内容在位于c:\foo\bar\mq\u 1.7.6\interface
的批处理文件中,变量realparent
将包含c:\foo\bar\mq\u 1.7.6
和parentdir
将包含c:\foo\bar\mq\u 1.7.6\interface\…
因此for
循环实质上是将相对路径转换为绝对路径。这里有一种方法:
@pushd "%~dp0..\"
@echo %cd%
@popd
短一行:
@pushd "%~dp0..\" && echo %cd% && popd
从您的问题中可以看出,您正在尝试检索脚本祖父母的名称,在本例中为mq_1.7.6
但仍有一点不清楚,您是希望将其隔离,即mq_1.7.6
,还是将其作为绝对路径,例如p:\ath\to\mq_1.7.6
如果您的意图是前者,那么以下内容就足够了:
@对于(“%$f0\..\”)中的%%A执行@Echo(%%~nxA)
如果需要将其作为变量,则:
@对于(“%$f0\..\”)中的%%A,执行@Set“Gp=%%~nxA”
如果您只是试图从mq_1.7.6
捕获版本字符串,在本例中为1.7.6
,则可能只需要一个简单的附加行:
@对于(“%$f0\..\”)中的%%A,执行@Set“Gp=%%~nxA”
@设置“Gp=%Gp:**=%”
另一方面,如果您想要后者,即脚本祖父母的绝对路径,唯一真正的区别在于元变量展开:
@对于(“%$f0\..\”)中的%%A执行@Echo(%%~fA)
如果需要将其作为变量,则:
@对于(“%$f0\..\”)中的%%A,执行@Set“Gp=%%~fA”
如果我对您的意图的解释都不正确,请您提供一个示例,说明您希望返回的内容,以及您是希望将其打印到控制台,还是将其保存为变量等。简单的解决方案可以是
对于%%I in(“%~dp0…”)设置“rootPath=%%~fI”
如果批处理文件存储在目录C:\Temp\Test&Debug\mq_1.7.6\interface
中,并且您需要目录路径C:\Temp\Test&Debug
。我相信您知道这一点,但只需提及,~f
也可以与。。。