2012-04-19 6 views
7

Tôi đang cố gắng chạy một tập tin thực thi chấp nhận một chuỗi bao gồm một tên biến. Biến này sau đó sẽ được sử dụng trong tệp lô. Ví dụ ...Làm cách nào để chuyển một tên biến như một phần của tham số vào một tệp lô và sau đó sử dụng nó?

C:\>test.bat user%num% 

Trong tập tin batch ...

set num=1 
(This is where I need help... Somehow set domainusername=user1) 
echo %domainusername% 

set num=2 
... 

Ý tưởng là để cho phép các cuộc gọi hàng loạt để làm việc trong cùng một cách không phân biệt nơi tên biến là. Ví dụ ..

C:\>test.bat %num%user 
or 
C:\>test.bat us%num%er 

Edit:
Tôi đã làm được một số tiền hợp lý của nghiên cứu cố gắng để làm cho công việc này. Ý tưởng hứa hẹn nhất mà tôi đã thử là một vòng lặp để đánh giá đệ quy% 1 (trong ví dụ). Thật không may, tôi không thể làm cho nó hoạt động. Hy vọng rằng điều này gây ra một số ý tưởng cho người khác.

+2

Vì vậy, về cơ bản bạn đang tìm kiếm một mức gián tiếp trong các kịch bản thực thi? tức là Tham số được đưa vào tệp lô là một _pointer_ đến biến phải được đặt. Chúc may mắn với điều này, +1 nhân tiện. –

+0

Vâng, đó có vẻ là một cách hay để mô tả nó. Về cơ bản, tôi đang cố gắng cho phép một chuỗi "định dạng" được chuyển đến tệp lô. – Lodra

+0

Bạn có đang lập kế hoạch sử dụng '% username%' không? Đó là biến môi trường :) –

Trả lời

5

Code:

@ECHO off 
SET param=%1 
SET num=1 
CALL SET x=%param% 
ECHO %x% 

Đầu ra:

user1 
+0

Lòng tốt của tôi ... Đơn giản hơn nhiều so với mọi thứ tôi đang thử. GỌI ... nó hoạt động hoàn hảo. – Lodra

+0

Tôi muốn lưu ý ở đây rằng điều này có thể được thực hiện nhiều hơn một lần, đó là một cách hoàn hảo để mở rộng một chuỗi trước khi thực hiện lệnh.Thêm một lần nữa – Lodra

+0

Xem phụ lục trong câu trả lời của tôi dưới đây ... – Aacini

1

Xin lỗi. Tôi nghĩ rằng tôi không thực sự hiểu những gì bạn muốn. Tuy nhiên ...

Nếu bạn vượt qua tên của một biến vào một tập tin hàng loạt, bạn có thể gán một giá trị cho biến mà trực tiếp theo cách này:

set %1=Any value 

Nếu bạn muốn get giá trị của biến số đó, bạn cần sử dụng Mở rộng trễ: chèn setlocal EnableDelayedExpansion lệnh lúc bắt đầu và kèm theo tên biến (tham số% 1) trong dấu chấm than:

setlocal EnableDelayedExpansion 
set varValue=!%1! 

Trong trường hợp của bạn, tôi đoán bạn muốn đạt được một cái gì đó như thế này:

set num=1 
set domainusername=!user%num%! 
echo %domainusername% 

nhưng điều này không sử dụng tham số% 1 như bạn nói, vì vậy tôi không biết ...

tôi hy vọng nó sẽ giúp ...

EDIT: có lẽ this post có thể hữu ích cho bạn ...

Phụ lục: Sau khi tôi đã nhận ra những gì OP muốn, đây là giải pháp của tôi:

@ECHO off 
setlocal EnableDelayedExpansion 
SET param=%1 
SET num=1 
SET x=!param! 
ECHO %x% 

Một trì hoãn việc mở rộng thực hiện nhanh hơn so với một CALL ...

+0

Có, tôi đã nghĩ về việc sử dụng mở rộng chậm trễ, nhưng tôi cũng không thể thực hiện công việc này. Phần phức tạp ở đây, là% 1 chứa một chuỗi và biến tôi cần sử dụng. Vì vậy, tôi không biết làm thế nào tôi có thể làm cho "set% 1 = value" làm việc cho tôi. Thực sự mát mẻ mặc dù. Tôi đã không bao giờ nghĩ rằng để làm điều đó – Lodra

+1

Có lẽ nếu bạn đăng một ví dụ lớn hơn với các giá trị từng bước ("cho điều này ... Tôi muốn có được điều này ... vv) Tôi có thể giúp bạn tốt hơn – Aacini

+0

Thứ nhất, cảm ơn Thứ hai, tôi sẽ cố gắng mở rộng câu hỏi gốc sớm – Lodra

0

Như một suy nghĩ, bạn có thể xem xét thử nghiệm biến đó trước khi bạn quyết định nó thực sự ở đó.Thêm phần này vào đầu chương trình của bạn:

if %1.==. goto :usage_orwherever 
3

Khi tôi hiểu OP, câu trả lời của Aacini và lưu lượng truy cập là sai.

Giải pháp mở rộng trễ (của Aacini) chỉ có thể hoạt động nếu num được xác định trước khi bắt đầu lô, nếu không %mnm% sẽ không bao giờ mở rộng.

C:\>set "num=" 

C:\>myBatch.bat user%num% 

kết quả đầu ra của
user%num%

Các giải pháp khác (của stackoverflow) hoạt động tốt hơn một chút, nhưng không khi num được định nghĩa

tôi đã thêm một giây set num=2 để chứng minh it

@ECHO off 
SET param=%1 
SET num=1 
CALL SET x=%param% 
ECHO %x% 

set num=2 
CALL SET x=%param% 
ECHO %x% 

Gọi nó hai lần cho thấy vấn đề

C:\>myBatch user%num% 
user1 
user2 

C:\>myBatch user%num% 
user2 
user2 

Về lâu thứ hai bạn có 2 hai lần, như kết quả được cố định ở lần khởi động của hàng loạt.

Bạn nên lặp lại nội dung của %1 để xem định dạng -string có thực sự ở đó không hoặc nếu %num% đã được mở rộng.

Khi tôi hiểu OP (Có thể tôi không hiểu!), Câu hỏi là sử dụng trình giữ chỗ,
nhưng điều này khó khăn với phần trăm vì nó chỉ hoạt động ở dòng lệnh (không phải từ một lô khác) và nó chỉ hoạt động nếu biến không được xác định trong thời điểm đó.
Vì, nếu biến được xác định, thì %num% sẽ mở rộng ngay lập tức và nội dung của %1user2 và không user%num% (giả định num = 2).

Điều đó đôi khi hoạt động chỉ là tác dụng phụ của trình phân tích cú pháp dòng cmd, vì nó không loại bỏ biến không xác định (như bên trong tệp lô), thay vào đó mở rộng biến không xác định sẽ không thay đổi theo bất kỳ cách nào.

echo "%thisIsUndefined%" - from cmd-line this outputs `"%thisIsUndefined%"` 
echo "%thisIsUndefined%" - from a batch file this outputs `""` 

Nhưng do tác dụng phụ, không tồn tại cách thoát dấu phần trăm trong ngữ cảnh dòng cmd.
Chỉ tồn tại một giải pháp thay thế cho lối thoát giả mạo.
mybatch user%num^%
Nó không thực sự thoát khỏi phần trăm, nhưng hầu hết sẽ không tồn tại một biến có tên là num^.

Sau đó, các giải pháp của stackoverlow sẽ làm việc với:

myBatch user%num^% 

Nhưng tôi sẽ prefere việc mở rộng chậm, đề cập bởi Aacini.
Bạn sẽ gọi lô sau đó với dấu chấm than, thay vì phần trăm, thông thường điều này hoạt động tốt, như mở rộng chậm trễ là theo mặc định bị vô hiệu hóa.

myBatch user!num! 

Lô bản thân sẽ trông như thế này

@echo off 
set "param=%1" 
Setlocal EnableDelayedExpansion 
set num=1 
echo %param% 
set num=2 
echo %param% 
+0

Thú vị ... Tôi chưa chắc, nhưng tôi có thể cần phải làm điều này. Cảm ơn – Lodra