2012-08-28 10 views
5

Tôi đang cố gắng để có được tương đương với CMD của bash tính năng sau đây:CMD biến thay thế cho các thông số

$ FOO=foo.bar 
$ BAR=bar 
$ BAZ=baz 
$ echo ${FOO/$BAR/$BAZ} 
foo.baz 

Bây giờ, CMD có lệnh subsitution somehwat tương tự khi cả hai mô hình và sự thay thế là liên tục:

C:\>set FOO=foo.bar 
C:\>set BAR=bar 
C:\>set BAZ=baz 
C:\>echo %FOO:bar=baz% 
foo.baz 

Tuy nhiên, tôi dường như không thể tham khảo các biến trong đó -

C:\>echo %FOO:%BAR%=%BAZ%% 
%foo:bar=baz% 

Tôi sẽ làm như thế nào? Điểm thưởng cho chỉ ra một cái gì đó mà cũng hoạt động bên trong một vòng lặp FOR trong một tập tin thực thi.

Trả lời

4

Sau đây (batch file) nên làm việc và in "foo.baz":

setlocal enabledelayedexpansion 
    set FOO=foo.bar 
    set BAR=bar 
    set BAZ=baz 

    echo !FOO:%BAR%:%BAZ%! 

(. Về điều FOR-loop bạn đề cập đến, bạn cần phải cung cấp thêm thông tin về chính xác những gì bạn có ý nghĩa)

+0

Cảm ơn, điều đó cũng hoạt động, bên trong một vòng lặp (giá trị% BAR% và% BAZ% của tôi ổn định trong vòng lặp, thật may mắn ...). – themel

2

Từ dòng lệnh:
call echo %FOO:%bar%=%baz%%

Trong hàng loạt và vòng lặp for:

@echo off 
    set FOO=foo.bar 
    set BAR=bar 
    set BAZ=baz 
for %%N in (baz ban bak) do (
set BAZ=%%N_AndSomething 
call :expand 
) 
goto :eof 

:expand 
call echo %%FOO:%BAR%=%BAZ%%% 
goto :eof 

Bạn có thể tối ưu hóa nó bằng cách sử dụng mở rộng trễ thay vì cuộc gọi thứ hai (cuộc gọi tốn kém), nhưng điều đó đã được hiển thị nên tôi để nó làm ví dụ về cú pháp. Nếu bạn không cần đặt biến được sử dụng thay thế bên trong khối for, bạn có thể đơn giản hóa nó hơn nữa.

+1

Cảm ơn đã cho tôi thấy việc sử dụng CALL để nội suy các biến! – themel