@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
)
đầu ra của 'REG QUERY% KEY_NAME%/v% VALUE_NAME%' là gì? – user2033427
Đầ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