2012-09-27 37 views
9

Tôi có chuỗi sau:chuỗi Parsing trong tập tin batch

MyProject/Architecture=32bit,BuildType=Debug,OS=winpc

Tôi muốn để có thể lấy các giá trị 32bit, Debug, và WinPC và lưu trữ chúng trong các biến có tên là Kiến trúc, BuildType, và Hệ điều hành để tham khảo sau này trong tập lệnh batch. Tôi thường là một người Unix nên đây là lãnh thổ mới cho tôi. Mọi sự trợ giúp sẽ rất được trân trọng!

Trả lời

24

này nên làm điều đó:

FOR /F "tokens=1-6 delims==," %%I IN ("MyProject/Architecture=32bit,BuildType=Debug,OS=winpc") DO (
    ECHO I %%I, J %%J, K %%K, L %%L, M %%M, N %%N 
) 
REM output is: I MyProject/Architecture, J 32bit, K BuildType, L Debug, M OS, N winpc 

FOR vòng lặp là một phần khá thú vị của máy móc. Nhập FOR /? trong bảng điều khiển để mô tả một số nội dung thú vị mà công cụ này có thể thực hiện.

+0

16 giây và sạch hơn nhiều! Tôi ra khỏi phiếu bầu cho ngày hôm nay, vì vậy tưởng tượng +1 cho bây giờ; trở lại với một cuộc bỏ phiếu thực sự sau đó. – LittleBobbyTables

3

Hãy thử như sau:

@ECHO OFF 

SET Var=MyProject/Architecture=32bit,BuildType=Debug,OS=winpc 

FOR /F "tokens=1,2,3 delims=," %%A IN ("%Var%") DO (
    FOR /F "tokens=1,2 delims==" %%D IN ("%%A") DO (
     SET Architecture=%%E 
    ) 
    FOR /F "tokens=1,2 delims==" %%D IN ("%%B") DO (
     SET BuildType=%%E 
    ) 
    FOR /F "tokens=1,2 delims==" %%D IN ("%%C") DO (
     SET OS=%%E 
    ) 
) 

ECHO %Architecture% 
ECHO %BuildType% 
ECHO %OS% 

PAUSE 
+4

Chỉ để cho vui, hãy cân nhắc thay thế ba vòng lặp 'FOR' bên trong của bạn bằng một dòng' SET %% A & SET %% B & SET %% C'. Đại danh BTW. –

5

Dưới đây là một giải pháp thú vị mà không quan tâm có bao nhiêu hoặc những gì đặt tên = giá trị cặp được quy định. Bí quyết là thay thế mỗi dấu phẩy bằng ký tự linefeed để FOR/F sẽ lặp lại từng cặp name = value. Điều này sẽ hoạt động miễn là chỉ có một / trong chuỗi.

@echo off 
setlocal enableDelayedExpansion 
set "str=MyProject/Architecture=32bit,BuildType=Debug,OS=winpc" 

::Eliminate the leading project info 
set "str=%str:*/=%" 

::Define a variable containing a LineFeed character 
set LF=^ 


::The above 2 empty lines are critical - do not remove 

::Parse and set the values 
for %%A in ("!LF!") do (
    for /f "eol== tokens=1,2 delims==" %%B in ("!str:,=%%~A!") do set "%%B=%%C" 
) 

::Display the values 
echo Architecture=%Architecture% 
echo BuildType=%BuildType% 
echo OS=%OS% 

Với mã bit hơn, nó có thể phân tích cú pháp một cách có chọn lọc chỉ các cặp tên = giá trị mà chúng tôi quan tâm.

@echo off 
setlocal enableDelayedExpansion 
set "str=MyProject/Architecture=32bit,BuildType=Debug,OS=winpc" 

::Eliminate the leading project info 
set "str=%str:*/=%" 

::Define a variable containing a LineFeed character 
set LF=^ 


::The above 2 empty lines are critical - do not remove 

::Define the variables we are interested in 
set "vars=Architecture BuildType OS" 

::Clear any existing values 
for %%A in (%vars%) do set "%%A=" 

::Set the values 
for %%A in ("!LF!") do (
    for /f "eol== tokens=1,2 delims==" %%B in ("!str:,=%%~A!") do (
    for %%D in (%vars%) do if "%%B"=="%%D" set "%%B=%%C" 
) 
) 

::Display the values 
for %%A in (%vars%) do echo %%A=!%%A! 
+0

Điều này trông thật tuyệt vời và không thể hiểu nổi. Tôi muốn biết thêm chi tiết về "% str =% str: */=%" và "! Str:, = %% ~ A!". Việc đầu tiên không có ý nghĩa tại sao có một '=' ở cuối, thứ hai có một bí ẩn ~ trong đó. – Kieveli

+0

Làm việc cho các tập dữ liệu nhỏ hơn, nhưng tôi đang truy vấn danh sách 24k mục bây giờ và việc gán một đầu ra lệnh có vẻ dài hơn độ dài tối đa cho phép đối với các biến tập tin batch. – Kieveli

+1

@Kieveli - Có, biến môi trường được sử dụng bởi CMD.EXE được giới hạn ở độ dài tối đa khoảng 8191 byte. – dbenham

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