2016-05-19 18 views
6

Các ký tự đặc biệt trong tệp hàng loạt là một nỗi đau, nhưng tôi đã không tìm được cách giải quyết đúng để thoát khỏi hai ký tự đầu tiên của chuỗi cụ thể này.Các ký tự đặc biệt trong tệp hàng loạt

SET pass=^&AntiBatchfileString 
A_Program.exe /pass=%pass% 

Những điều tôi đã cố gắng:

:: Escaping the escape twice, first for ^, second for &. 
SET pass=^^^^&AntiBatchfileString 
echo %pass% 

:: Combining escapes. 
SET first=^^ 
SET second=^^&AntiBatchfileString 
SET pass=%first%%second% 
echo %pass% 

:: Preventing expansion 
SET first=^^ 
SET second=^^&AntiBatchfileString 
SET pass=!first!%second% 
echo %pass% 

:: I got this to print correctly 
SET "pass=^&AntiBatchfileString" 
echo ^^%pass% 

Tuy nhiên khi đi qua người cuối cùng nó không chấp nhận đăng nhập, tôi không biết những gì đầu ra cuối cùng là. Điều đó khiến tôi nghĩ có lẽ nó đang cố gắng thực hiện một mở rộng khác khi truyền tham số cho ứng dụng, vì vậy tôi cũng trích dẫn điều đó.

SET "pass=^&AntiBatchfileString" 
A_Program.exe "/pass=^^%pass%" 

Nó vẫn không hoạt động, tôi không chắc mình đang thiếu gì vào thời điểm này.

+0

Bản sao có thể có của [Thoát ký tự hàng loạt] (https://stackoverflow.com/questions/6828751/batch-character-escaping) –

Trả lời

5

Giả sử bạn muốn chuỗi ^&AntiBatchfileString theo nghĩa đen, đây là set cú pháp tốt nhất, vì hầu hết các ký tự đặc biệt (^&()<>| và cũng chuẩn delimiters ,;=SPACETAB) mất ý nghĩa đặc biệt của họ ngay khi được đặt ở giữa số "" và chính bản thân số "" không trở thành một phần của giá trị biến:

set "pass=^&AntiBatchfileString" 

Điều này chỉ hoạt động miễn là tiện ích mở rộng lệnh được bật, mặc định là Windows (loại cmd /? và xem tùy chọn /E).

Khi mở rộng (đọc) biến số như "%pass%" (có kèm theo ""), các ký tự đặc biệt vẫn được xử lý theo nghĩa đen.

Tuy nhiên, ngay khi bạn mở rộng nó như %pass% (không có ""), chúng sẽ lấy lại ý nghĩa đặc biệt của chúng. Vì vậy, bạn có các tùy chọn sau:

  1. Sử dụng set "pass=^^^&AntiBatchfileString", nơi ^^ thoát khỏi sự theo nghĩa đen ^^& các literal & khi đọc như %pass%.
  2. Bật mở rộng trễ (xem set /? về cách hoạt động và setlocal /? hoặc cmd /? về cách bật), nơi giá trị biến được mở rộng (đọc) tại thời điểm phân tích các ký tự đặc biệt đã được hoàn thành.

Tôi thích cách tiếp cận thứ hai, vì không cần thoát đặc biệt và cũng có thể xử lý " xuất hiện trong giá trị chuỗi (ngay cả khi không có đối xứng).
Nhân tiện, " cũng có thể được thoát bởi ^", miễn là điều này không xuất hiện trong phạm vi chưa được thoát "".

Tuy nhiên, % dấu hiệu không thể trốn thoát như ^% trong một tập tin thực thi, nhưng bạn cần phải tăng gấp đôi họ như %% để có được một một nghĩa đen từng, độc lập hay không chuỗi là ở giữa "".
Lưu ý rằng trên bảng điều khiển, %% không hoạt động mặc dù ^% thực hiện.

Cuối cùng, tính năng mở rộng bị trì hoãn khi được bật, do đó bạn cần đặc biệt chú ý đến những trường hợp đó, bằng cách thoát chúng như ^! hoặc cũng bằng cách thông minh. nó thực sự cần thiết và để vô hiệu hóa nó nếu không, khi một chuỗi ký tự được cung cấp, ví dụ như trong dòng lệnh set, khi mở rộng biến chuẩn như %pass% và khi đọc biến số for như %%I (tập tin theo lô) hoặc %I (bảng điều khiển)), ví dụ). Tất nhiên đây cũng không phải là giải pháp tối thượng, bởi vì bạn cần setlocalendlocal để bật/tắt mở rộng chậm, nhằm thay đổi môi trường, vì vậy bất kỳ thay đổi biến nào do lệnh setlocal gần đây nhất bị mất ngay sau khi endlocal được thực hiện (có một số thủ thuật để vượt qua một giá trị thay đổi qua ngưỡng cản endlocal).

+0

Ah tôi thấy bây giờ, cộng với sau khi không thích thú với nó rất nhiều, tôi đã không nhận ra rằng tôi để phần này trong '"/pass =% pass% "' trong khi thử các thứ khác. Nó hiện đang hoạt động và cảm ơn các mẹo, @aschipfl! –

Các vấn đề liên quan