Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 通过目录的CMD脚本获取绝对路径_Batch File_Cmd - Fatal编程技术网

Batch file 通过目录的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%%% 我试图从接口目录中调用的文件中获取下面几个路径中的

正在调用的脚本。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%%%

我试图从
接口
目录中调用的文件中获取下面几个路径中的绝对目录路径。然而,问题是上面代码中的路径发生了变化。
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
也可以与。。。