2011-04-14 71 views
1

以下鍵具有多個值,如「查找」,「查找0」,查找1「,」查找2「等。 \ 9.0 \查找批處理文件刪除註冊表中某個鍵中的多個值

值與使用增加,我有最大數量的先驗知識。 目標是不知道的最大值事先創建一個批處理文件來刪除所有的「查找*」的價值觀。

我嘗試了以下最大數量= 10:

@ECHO OFF 
FOR /L %%G IN (0,1,10) DO REG DELETE HKCU\Software\Microsoft\VisualStudio\9.0\Find /v "Find %%G" /f 
PAUSE 

如果我對此沒有想法,我該如何循環至最大值?

我可以把一個像100這樣的大數字循環。但那將是不必要的循環。

理念:

後達到最大數量就拋出一個錯誤控制檯

"Error: The system was unable to find the specified registry key or value" 

我想捕捉這一個變量,並檢查字符串「錯誤... 。「,如果爲true,則終止循環。 我不知道如何做到這一點。

回答

1

您需要用WHILE循環替換FOR循環。

當然,在批處理腳本中沒有'WHILE循環'這樣的事情。它通常用IF和GOTO模擬。

下面是一個示例腳本:

@ECHO OFF 
SET G=-1 
SET Err=0 
:loop 
SET /A G+=1 
REG DELETE HKCU\Software\Microsoft\VisualStudio\9.0\Find /v "Find %G%" /f || SET Err=1 
IF %Err% == 0 GOTO loop 
PAUSE 

正如你所看到的,錯誤是補時||運營商的幫助。 ||之後的命令僅在||之前導致錯誤時執行。因此,當腳本成功刪除值時,Err變量保持不變,即等於0,因此後續IF總是計算爲TRUE並相應地執行GOTO。

只要嘗試刪除另一個值時發生錯誤,就會執行SET Err=1命令,因此我們將退出循環。


EDIT的變更請求。

要佔Find參數(不名後數字和空格),你就必須以不同的方式行事了一下,也許是這樣的:

@ECHO OFF 
SET G=-1 
SET Err=0 
:loop 
IF %G% == -1 (SET ParamName="Find") ELSE (SET ParamName="Find %G%") 
REG DELETE HKCU\Software\Microsoft\VisualStudio\9.0\Find /v %ParamName% /f || SET Err=1 
IF %Err% == 0 (SET /A G+=1 & GOTO loop) 
PAUSE 
+0

這是完美的。非常感謝Andriy。 – ontherocks 2011-04-18 06:14:42

+0

我有幾個問題 1.「||之後的命令只有在||之前的命令導致錯誤時纔會執行。」這種說法對任何控制檯命令中的所有錯誤都是真實的嗎我很困惑,因爲「REG DELETE」命令沒有返回值。 2.還有一個值「查找」,它沒有任何尾隨號碼。我將如何刪除使用相同的goto循環? – ontherocks 2011-04-18 06:17:09

+0

@ontherocks:1.它與所謂的退出代碼*有關,它由任何應用程序返回。它不顯示,但可以使用'IF ERRORLEVEL'指令進行檢查,2)通過讀取'ERRORLEVEL'環境變量,或者3)在'&&'和'||'運算符的幫助下進行檢查。你可以閱讀更多關於它[這裏](http://www.robvanderwoude.com/errorlevel.php)。 2.我添加了一個修改後的解決方案,但通常你應該發佈一個新問題。 (雖然你的要求與你最初的問題密切相關,但它會改變我原來的方法。)請記住未來。 – 2011-04-18 07:11:51

相關問題