2012-04-19 205 views
7

是否可以将绝对路径转换为批处理文件中的相对路径? (与this相反)。显然你需要两个输入:转换的绝对路径,以及一个你希望它被相对化的绝对参考路径。将绝对路径转换为批处理文件中的相对路径

如:

Path to convert: c:\documents\mynicefiles\afile.txt 
Reference path: c:\documents 
Result:   mynicefiles\afile.txt 

回答

5
@echo off 
setlocal EnableDelayedExpansion 
set Path_to_convert=c:\documents\mynicefiles\afile.txt 
set Reference_path=c:\documents 
set Result=!Path_to_convert:*%Reference_path%\=! 
echo Result: %Result% 
+0

谢谢,这似乎很好地工作!我从来没有见过这种语法,请你提供一个解释或链接? – 2012-04-20 04:28:53

+0

我也是upvoting,因为它的作品,即使我讨厌说,我不知道为什么。 – 2012-04-22 18:55:22

+0

类型:'SET /?',并在“环境变量替换已被增强如下:%PATH:str1 = str2%”下寻找解释,并且还在“延迟的环境变量扩展允许您...” – Aacini 2012-04-23 22:00:22

0

这里是工作,如果你想从一个字符串的开始删除%CD%的另一种方法。速度很慢,但如果情况允许,可以降低循环次数。

call :removeCommonAtStart outvar C:\Users\Public\Documents\ASUSAccess 

:removeCommonAtStart 
:: Description: loops through two strings and sets new variable representing unique data 
:: Required parameters: 
:: name - name of the variable to be returned 
:: test - string to have common data removed from start 
:: Optional parameters: 
:: remove - string if not defined then use %cd% as string. 
:: Required functions: 
:: removelet 
set name=%~1 
set test=%~2 
set remove=%~3 
if not defined remove set remove=%cd% 
set endmatch= 
FOR /L %%l IN (0,1,150) DO if not defined notequal call :removelet 
goto :eof 

:removelet 
:: Description: called by removeCommonAtStart to remove one letter from the start of two string variables 
:: Required preset variables: 
:: test 
:: remove 
:: name 
set test=%test:~1% 
set %name%=%test:~1% 
set remove=%remove:~1% 
if "%test:~0,1%" neq "%remove:~0,1%" set notequal=on&exit /b 
goto :eof