2013-04-29 55 views
6

我有一個讀取註冊表值的批處理文件。使用批處理文件讀取包含空格的註冊表值

但是,我正在閱讀的條目包含空格,並且我只能在設置我的變量時捕獲第一個空格字符之前的所有內容。

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:\ Program Files文件(x86)的\方向1 \方向2」 和批處理文件只捕獲這樣的:C:\ PROGRAM

有誰有如何解決這個問題的想法?

由於

+0

什麼是'REG QUERY%KEY_NAME%/ V%VALUE_NAME%'輸出? – user2033427 2013-04-29 14:37:28

+0

輸出顯示了註冊表名稱,類型和數據(現在全部包含整個字符串:-))。那麼我將如何將它的數據部分存儲在一個變量中? Thankss! – Yos 2013-04-29 14:42:12

回答

7

發生此問題,因爲字符串包含空格和字符串(可能多個部分是否有更多的空間)的所述第二部分作爲另一令牌進行處理(在圖4,圖5,等)要修復此,通過行的其餘部分至%%下用這樣的星號:

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 
) 

星號(*)指的行的其餘部分通入下一個變量(與所有的空格)。

+0

啊我明白你在說什麼了。這是我的擔心,因爲路徑實際上可能有很多空間,因此增加令牌等是不可能確定的?非常感謝。我已經改變了我的代碼,它似乎工作。乾杯 – Yos 2013-04-29 15:24:29

+0

在我的測試中,'2 *'會爲每個空格分隔的元素創建變量。因此,一個用空格返回路徑的'reg query'將產生一個'%c'和'%d'。例如:'FOR/F「令牌= 2,3 * skip = 2」%% L IN( \t'reg query「HKLM \ SOFTWARE \ Microsoft \ Microsoft SDKs \ Windows \ v7.1 \ WinSDKTools」/ v InstallationFolder' )DO echo %% M'返回'C:\ Program'。 – 2014-03-12 12:47:49

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. 

由於我沒有...\My Entry作爲關鍵,我用一個關鍵字代替了我。

第一項 - 由於所需數據包含空格,並且空格是默認分隔符,因此需要使用1,2*作爲標記 - 第一行,第二行和行剩餘行。

下一個難度不大的是,數據項也含有) whic被解釋爲的FOR/f因此給了一個錯誤的右括號 - 在你的情況,這裏沒有預期\Dir1\Dir2

辦法克服這是報價,然後剝離分配給home的值

但是再一次,home中的右括號用於終止IF語句的TRUE部分。

打開指定給HOME的值的存在/不存在克服了這一點。顯然,Valuename也可以這樣說,雖然這裏有一個隱藏的失敗失敗。

如果沒有找到所請求的註冊表項,然後SET S IN的FOR/f不執行,因此這三個變量的值不會從執行FOR/f纔可能有任何值改變。因此,如果home(或valuename,如果您選擇使用該值)在for/f之前的值爲someexistingvalue,則可能會出現意外的結果。

(順便說一句 - 這是合法的,整潔的外觀打破了for/f在一方或雙方IN條款的括號)

+0

哇,真是一個偉大而深入的答案!我正在使用user2033427所述的解決方案,它似乎很好。然而,你給了我一些想法並善於解釋。訣竅是將*添加到令牌命令。多謝你們! – Yos 2013-04-29 15:29:51

+0

嗨,在玩過兩個例子之後,似乎這個讓我檢查home變量是否被賦值,上面的解決方案在嘗試檢查home是否被定義時指出了錯誤。感謝我現在使用這個代碼,因爲它似乎很好。除了我之前提到的,上面的內容也是如此! :-) – Yos 2013-04-30 07:43:48

相關問題