Làm cách nào để trích xuất một phần của chuỗi trong tệp bó Windows?


29

Giả sử tôi có một giá trị như "Abc_123" được lưu trữ trong một biến trong tệp bó (cmd). Tôi muốn kết thúc với một biến chỉ chứa "123". Có cách nào tích hợp để làm điều này?

Tôi không quá quan tâm đến phương pháp hay hiệu năng, miễn là nó được tích hợp trong một hệ thống Windows (Vista / 2008) điển hình.

Câu trả lời:


40

Sử dụng cú pháp chuỗi con:

C:\Users\John>set string=Abc_123

C:\Users\John>echo %string%
Abc_123

C:\Users\John>echo %string:~4,3%
123

4
Bạn có thể thấy cú pháp đầy đủ với help setnhư được đề cập trong Cách tốt nhất để thực hiện một chuỗi con trong một tệp bó là gì? trên StackOverflow.
Người dùng5910

1
Nếu tôi cần 4 và 3 đó làm đầu vào biến, tôi sẽ làm thế nào? %string:~%start%,%len%%
MakPo

đừng bận tâm. Tôi tìm thấy câu trả lời. ss64.com/nt/syntax-subopes.html
MakPo

3
Để tóm tắt liên kết từ @MakPo: hãy sử dụng CALL, nhưCALL SET _substring=%%_donor:~%_startchar%,%_length%%%
bugybunny

8

Nếu bạn chỉ muốn mọi thứ sau dấu gạch dưới (và không nhất thiết phải biết độ dài của chuỗi hoặc vị trí của dấu gạch dưới, nhưng có thể dựa vào đó chỉ có một dấu gạch dưới), hãy thử:

for /f "tokens=2 delims=_" %%a in ("%STRING%") do (
  set AFTER_UNDERSCORE=%%a
)

Về cơ bản, chuỗi của bạn sẽ được chia thành các mã thông báo bằng cách sử dụng dấu gạch dưới làm dấu phân cách (delims = _). Chỉ cái thứ hai (mã thông báo = 2) sẽ được chuyển (dưới dạng biến %% a) cho vòng lặp for. Vòng lặp sẽ chỉ chạy một lần vì bạn đang xử lý một chuỗi trong trường hợp này.

Nếu bạn muốn lưu nội dung cả trước và sau dấu gạch dưới, hãy thử:

for /f "tokens=1,2 delims=_" %%a in ("%STRING%") do (
  set BEFORE_UNDERSCORE=%%a
  set AFTER_UNDERSCORE=%%b
)

Lưu ý rằng %% a là biến cho mã thông báo đầu tiên của phần tách; %% b là biến cho mã thông báo thứ hai của phần tách.


3

Nếu bạn thấy rằng ngôn ngữ bó không đủ mạnh để làm những gì bạn muốn - và có thể bạn sẽ không mất quá nhiều thời gian để đi đến điểm đó - bạn có thể sử dụng Windows PowerShell . Điều này không được cài đặt theo mặc định trên tất cả các phiên bản Windows, nhưng bạn có thể tải xuống miễn phí.

Nếu bạn không thích ngôn ngữ PowerShell, thì có Perl. Bạn sẽ phải cài đặt nó trên tất cả các hệ thống. Có những người khác nữa.


Câu hỏi không phải là hỏi về Powershell hay Perl
Zimba

2
set var1=Abc_123
set var2=%var1:*_=%
echo %var2%

3
Điều này làm gì cụ thể?
Pimp Juice IT

Ồ, nếu bạn đang hỏi làm thế nào mã này hoạt động: nó loại bỏ mọi thứ trước số, trước một dấu gạch dưới.
Zimba

@Zimba có cách nào đơn giản là mở rộng điều này thành "lần cuối _" không? Ngoài ra tôi có thể tìm thấy điều này trong bất kỳ tài liệu nào?
TWiStErRob

Ok, tìm thấy một tài liệu, thêm vào để trả lời. Câu hỏi vẫn còn: làm thế nào để tôi *tham lam? Tôi đã sử dụng một ol 'tốt IF NOT ... GOTO :replace, nhưng sẽ tốt hơn nếu có cách tốt hơn.
TWiStErRob

1
@TWiStErRob: Tôi hiểu rồi. Nếu bạn không biết có bao nhiêu _, thì hãy lặp đến cái cuối cùng, sau đóset var
Zimba
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.