2012-04-19 23 views
7

Có thể chuyển đổi đường dẫn tuyệt đối thành đường dẫn tương đối trong tệp lô không? (đối diện với this). Rõ ràng bạn sẽ cần hai đầu vào: đường dẫn tuyệt đối để chuyển đổi và một đường dẫn tham chiếu tuyệt đối mà bạn muốn nó được tương quan lại.Chuyển đổi đường dẫn tuyệt đối thành đường dẫn tương đối trong tập tin thực thi

ví dụ:

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

Trả lời

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

Cảm ơn, điều đó dường như hoạt động hoàn hảo! Tôi chưa bao giờ thấy cú pháp đó trước đây, bạn có thể vui lòng cung cấp giải thích hoặc liên kết không? –

+0

Tôi cũng upvoting vì nó hoạt động, mặc dù tôi ghét phải nói, tôi không biết tại sao. –

+0

Loại: 'SET /?' Và tìm giải thích trong "Thay thế biến môi trường đã được tăng cường như sau:% PATH: str1 = str2%" và cũng theo: "Mở rộng biến môi trường bị trễ cho phép bạn ..." – Aacini

0

Dưới đây là một phương pháp làm việc nếu muốn bạn để loại bỏ các% cd% so với khởi đầu của một chuỗi. Nó chậm nhưng bạn có thể hạ thấp số vòng lặp nếu bạn tình huống cho phép.

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