2013-04-29 22 views
6

Kayıt defteri değerini okuyan bir toplu iş dosyası var.Toplu iş dosyasını kullanarak boşluk içeren kayıt defteri değerini okuyun.

Ancak, okuduğum giriş boşluk içeriyor ve değişkeni ayarlarken yalnızca ilk boşluk karakterinden önce her şeyi yakaladım. "C: \ Program Files (x86) \ Dir1 \ Dir2": C: ve toplu dosyası sadece bu yakalar

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. 
) 

ev kayıt girdisi aslında bu dizeyi içeren Programı \

herkes var mı bir Bunu nasıl düzelteceğimiz fikri?

sayesinde

+0

'REG SORGU% KEY_NAME%/hacim% VALUE_NAME%' çıktısı nedir? – user2033427

+0

Çıktı bana kayıt adı, türü ve veri (şimdi tam olarak i.e. tüm dizeyi içerir :-)) gösteriyor. Daha sonra veri bölümünün bir değişkende saklanmasını nasıl sağlarım? Thankss! – Yos

cevap

7

dizisi (4, 5, vb) sabitlemek için bir belirteci olarak kabul edilir boşluk ve karakter (muhtemelen daha fazla parça daha fazla boşluk varsa) ikinci bölümü içermektedir, bu sorun olur Bu, böyle bir yıldız işareti ile C %% satırın geri kalanı pass:

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 
) 

yıldız (*) (bütün boşluklu) aşağıdaki değişkene satırın geri kalanı geçmesi anlamına gelir. Ben bir anahtar olarak ...\My Entry olmadığından

+0

Ah Ne söylediğini görüyorum.Yolun aslında çok fazla boşluğa sahip olacağından ve dolayısıyla artan belirteçlerin vb. Tespit edilmesinin imkansız olduğu gibi benim için üzülüyor muydu? Çok teşekkür ederim. Kodumu değiştirdim ve bir tedavi çalışması gibi görünüyor. Cheers – Yos

+0

Testimde '2 *', her boşlukla ayrılmış eleman için değişkenlerin oluşturulmasına neden oluyor. Bu yüzden, bir boşluk ile bir yol döndüren bir 'reg sorgu', bir '% c' ve '% d' üretecektir. Örneğin: "FOR/F" token = 2,3 * skip = 2 "%% L IN ( \t 'sorgu sorgusu" HKLM \ SOFTWARE \ Microsoft \ Microsoft SDKs \ Windows \ v7.1 \ WinSDKTools "/ v InstallationFolder' )% Echo %% M' 'C: \ Program' döndürür. –

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. 

, ben var bir anahtar ikame ettik.

İlk madde - gerekli veri bir boşluk içeriyor ve boşluk varsayılan bir sınırlayıcı olduğundan, 1,2* tokens - ilk, saniye ve kalan satır - olarak kullanılmalıdır. , \Dir1\Dir2 bu etmektir aşmak için buraya

bir yolu beklenmemektedir sizin durumunuzda -

yanındaki küçük zorluk veri öğesi AYRICA FOR/f dolayısıyla bir hata vererek kapanış parantez olarak yorumlanır yüklenebileceğini ) içermesidir Alıntı yaptıktan sonra home

'a atanan değeri şeritleyin. Ancak bir kez daha, home'daki kapanış parantezi IF deyiminin TRUE bölümünü sonlandırmaya yarar. HOME'a atanan bir değerin varlığını/yokluğunu açmak

. Açıkça görülüyor ki, burada başarısız bir başarısızlık hatası olsa da aynı şey Valuename için söylenebilir. İstenen kayıt defteri girdisi bulunmazsa

ardından FOR/f içinde SET ler dolayısıyla üç değişkenin değerleri FOR/f çalıştırılmadan önce onlar olabilecek değerden değişmez, gerçekleştirilmez. Bu nedenle, home (veya bu değeri kullanmayı seçerseniz valuename) someexistingvalue değerini for/f önce varsa, beklenmedik sonuçlar sunulabilir.

(BTW - bu meşru ve en ya for/f kırmak için kıvrımlara görünümlü veya IN maddesinin parantez ikisi)

+0

Vay ne muhteşem ve derin bir cevap! Ben user2033427 tarafından açıklanan çözümü kullanıyorum ve harika çalışıyor gibi görünüyor. Ancak bana bir şeyler hakkında düşünmek için bir şeyler verdin ve bir açıklama olması güzel. Hile, tokens komutuna * ekliyordu. Teşekkürler beyler! – Yos

+0

Merhaba, her iki örnekte de oynadıktan sonra, ev değişkeninin atanıp atanmadığını kontrol etmeme izin vermiş gibi görünüyor, yukarıdaki çözüm, evinizin tanımlanıp tanınmadığını kontrol etmeye çalıştığınızda belirttiğiniz gibi bir hata atıyordu. Teşekkürler, şimdi bu kodu büyük işe yaramış gibi kullandım. Yani yukarıda bahsettiğim şeyden ayrı! :-) – Yos

İlgili konular