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 %1
là user2
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%
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. –
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
Bạn có đang lập kế hoạch sử dụng '% username%' không? Đó là biến môi trường :) –