批处理文件目录扩展

时间:2010-08-09 22:06:07

标签: batch-file

我正在尝试编写一个存在于任意目录中的批处理文件,并将在其上方两级创建一个新目录。例如,批处理文件在这里:

w:\src\project\scripts\setup.bat

会创建:

w:\src\project.build

我似乎无法弄清楚如何扩展路径。以下是我目前正在做的事情:

@set SCRIPT_DIR=%~dp0
@set ROOT_DIR=%SCRIPT_DIR%\..
echo ROOT DIR:  %ROOT_DIR%
@set ROOT_DIR_NAME=%ROOT_DIR:~0,-1%
@echo ROOT DIR NAME: %ROOT_DIR_NAME%

这会产生:

ROOT DIR:  w:\src\w_dev1\scripts\\..
ROOT DIR NAME: w:\src\w_dev1\scripts\\.

我想做的是让ROOT_DIR_NAME成为目录本身(没有斜杠)。我知道我可以破解这个并切换-1来解释'..',但是有没有更清洁的方法来处理这个问题?

3 个答案:

答案 0 :(得分:4)

您的行@set ROOT_DIR_NAME=%ROOT_DIR:~0,-1%会从变量值中删除1个字符。你想删除更多('脚本'有7个,加上你最后有'\ ..')。您确定始终将“脚本”作为安装路径中的最后一个目录吗?

无论如何,如果您使用@set ROOT_DIR_NAME=%ROOT_DIR:~0,-11%,它应该适用于您的特定示例。

但是,我建议你使用更通用的方法:

@set SCRIPT_DIR=%~dp0
@pushd %script_dir%
@pushd ..\..
@echo. current directory now is %cd%
@set root_dir=%cd%
@popd
@popd

这与目录名的长度无关。

pushd命令更改目录(并记住它来自哪里) - popd命令返回pushd所记住的内容。 %cd%变量保存当前驱动器+路径。

答案 1 :(得分:3)

您可以使用for命令将相对路径解析为规范的绝对路径:

@echo off
set "SCRIPT_DIR=%~dp0"
for %%P in ("%SCRIPT_DIR%..\..") do set "ROOT_DIR_NAME=%%~fP"

此脚本会将ROOT_DIR_NAME设置为脚本的祖父目录。

答案 2 :(得分:0)

或本地子程序

call :setvartopath ROOT_DIR_NAME "%~dp0\..\.."
goto :eof

:setvartopath
set %1=%~f2
相关问题