2014-03-12 25 views
7

我努力將一個註冊表項的值讀入一個變量。註冊表值可能會或可能不會包含空格。在這種情況下,我試圖查找SDK路徑。讀取一個註冊表值到一個批處理變量,處理值空間

很容易與reg query獲得的價值,但它在一個非常無益的格式返回:

C:\Users\Administrator\Desktop>reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDKTools" /v InstallationFolder 

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDKTools 
    InstallationFolder REG_SZ C:\Program Files\Microsoft SDKs\Windows\v7.1\bin\ 

鍵名,密鑰類型和密鑰值由一系列的空格,不製表符分隔。

你以爲你可以使用類似:

FOR /F "usebackq tokens=3* skip=2" %%L IN (
    `reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDKTools" /v InstallationFolder` 
) DO SET sdkpath=%%L 

...但如果鍵包含空格,在這種情況下,在命令行上發出的結果是:

C:\Users\Administrator\Desktop>SET sdkpath=C:\Program 

這是沒有用的。似乎沒有一個通配符變量來說「所有匹配」。你不能只是寫:

DO SET sdkpath=%%L %%M 

...因爲如果有路徑空間,這將產生一個文字%M(也將產生一個空格)。

所以。有沒有辦法在批處理文件中做這個簡單的事情?

我已經在Powershell(和一些Perl)中編寫了大部分工具,但是我需要使用批處理文件來執行「簡單」任務call,然後調用visual studio/windows sdk環境腳本,然後調用代碼一旦環境建立起來,就會以一種健康的語言出現。

你會認爲經過10多年的cmd.exe的存在以及command.com之前,這會很容易。幫幫我?

(我可以用Perl和Win32::包查詢註冊表,但它不會幫我把它變成一個批處理變種...)

使用Win2k12。

我讀過:

和許多其他人,但沒有處理的正確讀取從鍵的值不知道是否該一般情況下不是它包含空格/多少。

回答

9

這是關於for /f命令的令人討厭的細節之一。爲了讀取所有字符,包括*的空格以前的標記需要聲明。 tokens=2,*功能原因在文檔中說明。

如果令牌的最後一個字符的字符串=是一個星號(*),一個附加變量被分配並接收分析的最後一個令牌之後上線剩餘的文本。

FOR Documentation

FOR /F "usebackq tokens=2,* skip=2" %%L IN (
    `reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDKTools" /v InstallationFolder` 
) DO SET sdkpath=%%M 
+2

哇。現在我討厭批處理文件比以前更多。但是謝謝你。 –

相關問題