2012-04-19 6 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

Спасибо, что работает отлично! Я никогда не видел этот синтаксис раньше, не могли бы вы предоставить объяснение или ссылку? –

+0

Я также поддерживаю, потому что он работает, хотя я ненавижу говорить, я не знаю, почему. –

+0

Тип: 'SET /?' И искать объяснение в разделе «Смещение переменных среды было улучшено следующим образом:% PATH: str1 = str2%», а также в разделе «Отложенное расширение переменной среды позволяет вам ...» – Aacini

0

Вот еще один метод, который работает, если ваш хотите удалить% кд% от начала строки. Это медленно, но вы можете снизить количество циклов, если это разрешит вам ситуацию.

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 
Смежные вопросы