2013-04-29 38 views
6

Tôi có tệp lô đọc giá trị đăng ký.Đọc giá trị đăng ký có chứa khoảng trắng bằng cách sử dụng tệp hàng loạt

Tuy nhiên, mục nhập mà tôi đang đọc có chứa khoảng trắng và tôi dường như chỉ ghi lại mọi thứ trước ký tự khoảng trắng đầu tiên khi đặt biến của tôi.

set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\My Entry" 
set VALUE_NAME=Home 

FOR /F "usebackq skip=2 tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
    set ValueName=%%A 
    set ValueType=%%B 
    set Home=%%C 
) 

if defined ValueName (
    @echo Home = %Home% 
) else (
    @echo %KEY_NAME%\%VALUE_NAME% not found. 
) 

Các mục đăng ký nhà thực sự chứa chuỗi này: "C: \ Program Files (x86) \ dir1 \ dir2" và tập tin thực thi chỉ chụp này: C: \ Program

Không ai có một ý tưởng làm thế nào để sửa lỗi này?

Cảm ơn

+0

đầu ra của 'REG QUERY% KEY_NAME%/v% VALUE_NAME%' là gì? – user2033427

+0

Đầu ra hiển thị cho tôi Tên, Loại và Dữ liệu đăng ký (Bây giờ đầy đủ nghĩa là bao gồm toàn bộ chuỗi :-)). Làm thế nào sau đó tôi sẽ lưu trữ một phần dữ liệu của nó trong một biến? Cảm ơn! – Yos

Trả lời

7

Vấn đề này xảy ra bởi vì các chuỗi chứa dấu cách và phần thứ hai của chuỗi (có thể nhiều phần nếu có không gian hơn) được coi là dấu hiệu khác (trong 4, 5, vv) Để khắc phục này, vượt qua phần còn lại của dòng đến %% C với dấu hoa thị như thế này:

FOR /F "usebackq skip=2 tokens=1,2*" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
    set ValueName=%%A 
    set ValueType=%%B 
    set Home=%%C 
) 

dấu (*) có nghĩa là để vượt qua phần còn lại của dòng vào biến tiếp theo (với tất cả các dấu cách).

+0

Ah tôi thấy những gì bạn đang nói.Đó là sự lo lắng của tôi vì con đường thực sự có thể có nhiều khoảng trống và do đó tăng mã thông báo, vv là không thể xác định? Cảm ơn bạn rất nhiều. Tôi đã thay đổi mã của tôi và nó có vẻ làm việc một điều trị. Chúc mừng – Yos

+0

Trong thử nghiệm của tôi, '2 *' gây ra các biến được tạo ra cho từng phần tử được phân cách bằng dấu cách. Vì vậy, một truy vấn 'reg' trả về một đường dẫn có dấu cách sẽ tạo ra'% c' và '% d'. Ví dụ: thẻ "FOR/F" = 2,3 * bỏ qua = 2 "%% L IN ( \t 'truy vấn reg" HKLM \ SOFTWARE \ Microsoft \ Microsoft SDK \ Windows \ v7.1 \ WinSDKTools "/ v InstallationFolder' ) DO echo %% M' trả về 'C: \ Program'. –

4
@ECHO OFF 
SETLOCAL 
set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\My Entry" 
set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Space Sciences Laboratory, U.C. Berkeley\BOINC Setup" 
set VALUE_NAME=migrationdir 

FOR /F "usebackq skip=2 tokens=1,2*" %%A IN (
`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
    set "ValueName=%%A" 
    set "ValueType=%%B" 
    set Home="%%C" 
) 

IF DEFINED home SET home=%home:"=% 
if defined Home echo Home = %Home% 
if NOT defined Home echo %KEY_NAME%\%VALUE_NAME% not found. 

Vì tôi không có ...\My Entry làm khóa, tôi đã thay thế khóa mà mình có.

Mục đầu tiên - vì dữ liệu được yêu cầu chứa không gian và không gian là dấu phân cách mặc định, bạn cần sử dụng 1,2* làm mã thông báo - thứ nhất, thứ hai và phần còn lại.

Khó khăn nhỏ bên cạnh là các mục dữ liệu CŨNG chứa ) whic được hiểu như là sự đóng ngoặc của FOR/f do đó đưa ra một lỗi - trong trường hợp của bạn, \Dir1\Dir2 không mong đợi đây

Một cách để khắc phục điều này là để báo giá, sau đó chia giá trị được gán cho home

Nhưng một lần nữa, dấu ngoặc đơn trong home sẽ kết thúc phần TRUE của câu lệnh IF.

chuyển đổi sự hiện diện/vắng mặt của giá trị được gán cho HOME vượt qua điều này. Rõ ràng, điều tương tự có thể được nói cho Valuename mặc dù có một thất bại ẩn không thành công ở đây.

Nếu không tìm thấy mục đăng ký được yêu cầu, thì SET s trong FOR/f không được thực hiện, do đó giá trị của ba biến không thay đổi từ bất kỳ giá trị nào có thể có trước khi thực hiện FOR/f. Do đó, nếu home (hoặc valuename nếu bạn chọn sử dụng giá trị đó) có giá trị là someexistingvalue trước for/f thì kết quả không mong muốn có thể được trình bày.

(BTW - đó là hợp pháp và gọn gàng-tìm cách để phá vỡ for/f tại một trong hai hoặc cả hai dấu ngoặc đơn của mệnh đề IN)

+0

Wow những gì một câu trả lời tuyệt vời và chuyên sâu! Tôi đang sử dụng các giải pháp như mô tả bởi user2033427 và nó có vẻ làm việc tuyệt vời. Tuy nhiên bạn đã cho tôi một số công cụ để suy nghĩ và tốt để có một lời giải thích. Bí quyết đã được thêm * vào lệnh mã thông báo. Cảm ơn các bạn! – Yos

+0

Xin chào, sau khi chơi xung quanh với cả hai ví dụ, có vẻ như điều này cho phép tôi kiểm tra xem biến chủ đã được gán hay chưa, giải pháp ở trên là ném một lỗi như bạn đã chỉ ra khi cố gắng kiểm tra xem nhà có được xác định hay không. Cảm ơn tôi đã sử dụng mã này ngay bây giờ vì nó dường như làm việc tuyệt vời. Vì vậy, đã làm ở trên ngoài những gì tôi vừa đề cập! :-) – Yos