2013-02-05 21 views
5

Bài đăng đầu tiên của tôi, hầu hết các câu hỏi đã được giải quyết bằng cách sử dụng kiến ​​thức thân thiện được cung cấp tại đây. Nhưng bây giờ tôi hết ý tưởng, một lần nữa với một câu hỏi về xử lý các ký tự độc trong cmd.exe.Dấu hiệu phần trăm thoát trong các biến đã cho

Giả sử có một biến chuỗi đã cho kèm theo dấu ngoặc kép. Hầu hết các ký tự độc đã được thay thế bởi các ký tự thông thường trước đó, những ký tự bên trái làm phiền tập lệnh là "&", "(", ")" và "%". Chuỗi phải được lặp lại thành một tệp không có dấu ngoặc kép sau đó. Vì vậy, tôi đã có ý tưởng để thoát khỏi nhân vật độc tăng gấp ba lần:

@echo off & setlocal ENABLEEXTENSIONS 
SET AlbumArtist=%1 
CALL :EscapePoisonChars %AlbumArtist% AlbumArtist_VDN 

SET "FlacHyperLink==hyperlink^("file://%AlbumArtist_VDN%"^;"LossLess"^)") 
echo %FlacHyperLink% 
echo %AlbumArtist_VDN% 

endlocal &GOTO:EOF 

:EscapePoisonChars 
@echo off & setlocal ENABLEEXTENSIONS 
SET TmpString=%1 
SET TmpString=%TmpString:&=^^^&% 
SET TmpString=%TmpString:(=^^^(% 
SET TmpString=%TmpString:)=^^^)% 
endlocal&SET %2=%TmpString:~1,-1%&GOTO :EOF 

Khi tôi gọi kịch bản của tôi ở trên tôi nhận được kết quả mong muốn - ngoài các ký hiệu phần trăm mất tích:

G:\YAET\20130204_Work>TryAmper.bat "100% Rock & Roll (7' UpMix)" 
=hyperlink("file://100 Rock & Roll (7' UpMix)";"LossLess") 
100 Rock & Roll (7' UpMix) 

G:\YAET\20130204_Work> 

Tôi biết rằng phần trăm có thể được tự thoát. Vì vậy, "%%" thường sẽ dẫn đến một chữ "%". Nhưng tôi không thể tìm được quy trình thay thế làm việc cho các dấu hiệu phần trăm vì cmd luôn diễn giải nó như một biến và cố gắng mở rộng nó. Đây có phải là hướng hoàn toàn sai để xử lý vấn đề này hay chỉ là sự hiểu lầm về việc mở rộng biến? Bất kỳ gợi ý chào đón! Cảm ơn!

Chúc mừng, Martin

Sửa Removed mã riêng, xem dưới đây câu trả lời Jeb cho giải pháp làm sạch.

Cảm ơn bạn đã trợ giúp, Martin

Trả lời

6

Câu hỏi hay!
Lúc đầu, có bạn có thể thay thế ngay cả các dấu hiệu phần trăm, nhưng không phải trong phần trăm mở rộng, bạn cần mở rộng chậm trễ ở đây.

Setlocal EnableDelayedExpansion 
set tmpstr=!tmpstr:%=%%! 

Nhưng nếu bạn sử dụng mở rộng trễ, bạn không cần thoát nữa, vì mở rộng trễ là giai đoạn cuối của trình phân tích cú pháp và tất cả các ký tự mất đi bất kỳ ý nghĩa đặc biệt nào.
Bạn chỉ cần lặp lại với việc mở rộng chậm trễ.

Echo !tmpvar! 

EDIT: giải pháp sạch

@echo off 
setlocal DisableDelayedExpansion 

REM * More or less secure getting the parameter 
SET "AlbumArtist=%~1" 

setlocal EnableDelayedExpansion 
SET "FlacHyperLink==hyperlink("file://!AlbumArtist!";"LossLess")" 

echo !FlacHyperLink! 
echo !FlacHyperLink!> hugo.txt 

Bạn cần disableDelayedExpansion đầu tiên, để có được dấu chấm than thậm chí từ %1.
Sau đó, bạn nên chuyển sang mở rộng trễ và sử dụng nó ở mọi nơi.

+0

Jeb, tôi hy vọng bạn sẽ trả lời sau khi tôi thấy [link] (http://ss64.org/viewtopic.php?pid=4919#p4919) với hack đáng kinh ngạc của bạn tôi vẫn không hiểu hoàn toàn. Cuối cùng, đề xuất của bạn ở trên đã giải quyết được vấn đề của tôi với các ký tự độc. Tôi đã thêm một đoạn mã ngắn dựa trên giải pháp của bạn cho câu hỏi của tôi bởi vì tôi muốn sử dụng định dạng khối mã. Cảm ơn rất nhiều! Martin – CmdQuestion

+0

Aarrg - anh làm cái quái gì thế? Tôi đã thêm một giải pháp _clean_ – jeb

+0

Jeb, xin lỗi nếu bạn không hài lòng với công việc của tôi. Sử dụng mã tôi gặp phải không có vấn đề cho bất kỳ sự kết hợp của các nhân vật, vì vậy tôi nghĩ rằng nó sẽ là tốt, đủ để trình bày kết quả ở đây. Tôi bỏ qua nó và chỉ đề cập đến giải pháp của bạn bây giờ. Martin – CmdQuestion

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