2012-01-06 25 views
18

Giả sử tôi có một số văn bản trong biến được gọi là $ 1. Bây giờ tôi muốn kiểm tra xem $ 1 đó có chứa một chuỗi nhất định không. Nếu nó chứa một chuỗi nhất định tôi muốn in một tin nhắn. Việc in ấn không phải là vấn đề, vấn đề là kiểm tra ... ý tưởng làm thế nào để làm điều đó?Kiểm tra chuỗi cho chuỗi con trong tập tin thực thi (Windows)?

+1

bắt đầu tại đây: http://www.dostips.com/DtTipsStringManipulation.php –

+0

Cảm ơn! Doesnt thực sự giúp đỡ ... Tôi đã hy vọng có somethiing dễ dàng hơn. Bất kỳ ý tưởng nào khác? – EOB

Trả lời

2

Theo như tôi biết cmd.exe không có chức năng tích hợp để trả lời câu hỏi của bạn trực tiếp. Nhưng nó hiện hỗ trợ thay thế hoạt động. Vì vậy, lừa là: trong $ 1 của bạn thay thế các chuỗi con bạn cần phải kiểm tra sự hiện diện của với một chuỗi rỗng, sau đó kiểm tra nếu $ 1 đã thay đổi. Nếu nó có thì đã làm chứa chuỗi con (nếu không thao tác thay thế sẽ không có gì để thay thế ngay từ đầu!). Xem mã bên dưới:

set longString=the variable contating (or not containing) some text 

@rem replace xxxxxx with the string you are looking for 
set tempStr=%longString:xxxxxx=% 

if "%longString%"=="%tempStr%" goto notFound 
echo Substring found! 
goto end 

:notFound 
echo Substring not found 

:end 
+1

Lưu ý - loại tìm kiếm này không phân biệt chữ hoa chữ thường. Cũng có thể có vấn đề với các ký tự đặc biệt. Nó mạnh mẽ hơn khi sử dụng mở rộng trễ cho cả tìm kiếm/thay thế và kiểm tra bình đẳng. Nhưng chuỗi tìm kiếm không thể chứa '=' char, và chuỗi tìm kiếm không thể bắt đầu bằng '~' hoặc '*'. – dbenham

+0

@dbenham: Nhận xét hoàn toàn công bằng, giải pháp của tôi là hoàn hảo (như cú pháp cmd). –

9

Thủ thuật tìm kiếm và thay thế SET hoạt động trong nhiều trường hợp, nhưng không hỗ trợ tìm kiếm cụm từ nhạy cảm hoặc cụm từ thông dụng.

Nếu bạn cần tìm kiếm trường hợp nhạy cảm hoặc hỗ trợ biểu thức chính quy có giới hạn, bạn có thể sử dụng FINDSTR.

Để tránh các biến chứng của việc thoát khỏi các ký tự đặc biệt, tốt nhất là nếu chuỗi tìm kiếm nằm trong một biến và cả tìm kiếm và đích đều được truy cập thông qua mở rộng trễ.

Bạn có thể đặt $ 1 vào lệnh FINDSTR bằng lệnh ECHO. Sử dụng ECHO( trong trường hợp $ 1 không xác định và hãy cẩn thận không thêm các khoảng trống thừa. ECHO !$1! sẽ echo ECHO is off. (hoặc bật) nếu $ 1 không xác định, trong khi ECHO(!$1! sẽ lặp lại một dòng trống nếu không xác định.

FINDSTR sẽ lặp lại $ 1 nếu tìm thấy chuỗi tìm kiếm - bạn không muốn điều đó, do đó bạn chuyển hướng đầu ra tới nul. FINDSTR đặt ERRORLEVEL thành 0 nếu chuỗi tìm kiếm được tìm thấy và 1 nếu nó không được tìm thấy. Đó là những gì được sử dụng để kiểm tra xem chuỗi đã được tìm thấy chưa. &&|| là cú pháp thuận tiện để sử dụng để kiểm tra kết quả phù hợp (ERRORLEVEL 0) hoặc không khớp (ERRORLEVEL không 0)

Hỗ trợ biểu thức chính quy là thô sơ nhưng vẫn hữu ích.

Xem FINDSTR /? để biết thêm thông tin.

Ví dụ biểu thức chính quy này sẽ tìm kiếm $ 1 cho "BEGIN" ở đầu chuỗi, "MID" ở bất kỳ vị trí nào ở giữa và "END" ở cuối. Tìm kiếm phân biệt chữ hoa chữ thường theo mặc định.

set "search=^BEGIN.*MID.*END$" 
setlocal enableDelayedExpansion 
echo(!$1!|findstr /r /c:"!search!" >nul && (
    echo FOUND 
    rem any commands can go here 
) || (
    echo NOT FOUND 
    rem any commands can go here 
) 
16

Cách đơn giản nhất trong quan điểm của tôi là thế này:

set YourString=This is a test 

If NOT "%YourString%"=="%YourString:test=%" (
    echo Yes 
) else (
    echo No 
) 

basiclly chuỗi sau ':' được chuỗi bạn đang tìm kiếm và bạn đang sử dụng không trước mặt nếu vì% chuỗi: * % sẽ xóa * khỏi chuỗi làm cho chúng không bằng nhau.

+2

Như với [câu trả lời của Igor] (http://stackoverflow.com/a/8757658/1012053), bài kiểm tra này bỏ qua trường hợp. Ngoài ra, nó là an toàn hơn để sử dụng mở rộng chậm trễ. Cuối cùng, nó không thể được sử dụng nếu chuỗi con chứa '='. – dbenham

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