2010-08-09 182 views
2

我正在尝试写一个存在于任意目录中的批处理文件,并且会在它上面创建一个新的目录。例如,批处理文件在这里:批处理文件目录扩展

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来说明'..',但是有没有一种更清晰的方式来处理这个问题?

回答

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%保存当前驱动器+路径。

+0

是否有必要'PUSHD%SCRIPT_DIR%',因为你已经在脚本目录开始(正确吗?)?在我的简单测试脚本中,这不是必要的,但也许我不知道在这里玩的陷阱。 – Pat 2012-06-04 23:06:32

+0

@Pat:您需要'pushd%script_dir%',因为您可能正在从另一个目录运行脚本。例如从'w:\ src'中的命令提示符处,您可以运行'project \ scripts \ setup.bat'。此外,快捷方式有“目标”和“开始”属性,并且“开始”目录不必与目标批处理文件具有相同的目录... – Grhm 2012-10-04 12:04:39

3

可以使用for命令来解决相对路径为规范的绝对路径:

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

该脚本将设置ROOT_DIR_NAME到脚本的宏伟父目录。

0

或本地子程序

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

:setvartopath 
set %1=%~f2