我正在尝试编写一个存在于任意目录中的批处理文件,并将在其上方两级创建一个新目录。例如,批处理文件在这里:
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来解释'..',但是有没有更清洁的方法来处理这个问题?
答案 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