2011-09-15 115 views
1

在分配第一個環境變量(下面的腳本輸出)後,我的批處理文件過早終止。我嘗試過使用errorlevels轉換echo,將輸出發送到文本文件並檢查語法。我花了幾個小時研究調試批處理腳本,但我終於碰到了一堵磚牆。批處理文件在目錄名稱中搜索字符串

腳本的目標:搜索用戶程序文件的每個目錄名稱,尋找常見的防病毒程序。我意識到,爲了達到這個目的,最簡單的方式是通過一系列防病毒名稱進行迭代,但我現在想保持簡單。

@echo off 
::variables 
set AntiVirus1="Initial Value" 

IF NOT ERRORLEVEL 0 echo %ERRORLEVEL% 
else echo "env. variable created successfully." 

for /d %%f in (""%ProgramFiles%\*"") do (
{ 
    IF NOT ERRORLEVEL 0 echo %ERRORLEVEL% 

    echo "%%f" 
    if exist /i "*McAfee*" < %%f %AntiVirus1%="McAfee" 
    ::find "Norton" < %%f 
    ::find "Comodo" < %%f 
    ::find "AVG" < %%f 

} 

echo %AntiVirus1% 

@pause 

輸出這個腳本:

C:\用戶\馬特\桌面>設置AntiVirus1 = 「初始值」 C:\用戶\馬特\桌面>

有人能指出我我做錯了什麼?


UPDATE修正後的腳本,現在的工作,但返回不正確的結果:

::@echo off 
::variables 
set AntiVirus1="Initial Value" 

IF NOT ERRORLEVEL 0 (echo %ERRORLEVEL%) ELSE echo "env. variable created successfully." 

echo Checking Program Files... 
for /d %%f in ("%ProgramFiles%\*") do (
    echo "%%f" 
    if %%f=="*adobe*" set AntiVirus1="adobe" 
) 

echo %AntiVirus1% found 

@pause 
+0

請不要更新這樣的問題。不僅你讓你的帖子不一致(你的第一段提到過早的終止不再是後面的腳本的問題!),但也沒有解決我的答案的第一部分。目前我通過在原始文本下面添加修改後的腳本來修復此問題。如果您認爲有必要,您可能需要進一步更新該文章,並附上明確的附加請求文字。 –

+0

良好的通話。我會確保將來做到這一點。 – KongMD

回答

2

首先,ELSE必須在同一行與IF與正在關閉的同一行與IF有關的括號。在你特定的情況下,你應該這樣改變你的第一個IF...ELSE命令:

IF NOT ERRORLEVEL 0 (ECHO %ERRORLEVEL%) ELSE ECHO "env. variable created successfully." 

或像這樣:

IF NOT ERRORLEVEL 0 (
    ECHO %ERRORLEVEL% 
) ELSE ECHO "env. variable created successfully." 

(資本和壓痕是完全可選的。)

其他問題:

  • 中的重複引號環頭:

    for /d %%f in (""%ProgramFiles%\*"") do (
    

    應該是

    for /d %%f in ("%ProgramFiles%\*") do (
    
  • 括號({})圍繞所述循環體。它們不是循環語法的一部分(事實上,它們根本不是批處理腳本語法的一部分),所以應該放棄。

  • 沒有右開括號與DO後的開頭相符。它應該在循環體之後的一個單獨的行上添加。

  • 錯誤地在循環體中使用::樣式註釋。他們不允許在括號內的塊內。改爲使用REM


UPDATE

在批處理腳本,測試一個子是有點不尋常完成。您需要另一個環境變量,並且還需要啓用延遲擴展。後者與比較並沒有真正的聯繫,但是這是需要的,因爲比較將在括號內進行。

這是你的新腳本修改,與變化強調:

::@echo off 
::variables 
set AntiVirus1="Initial Value" 

IF NOT ERRORLEVEL 0 (echo %ERRORLEVEL%) ELSE echo "env. variable created successfully." 

SETLOCAL EnableDelayedExpansion 

echo Checking Program Files... 
for /d %%f in ("%ProgramFiles%\*") do (
    echo "%%f" 
    SET "folder=%%f" 
    if /I NOT "!folder:adobe=!"=="!folder!" set AntiVirus1="adobe" 
) 

echo %AntiVirus1% found 

@pause 

這裏有一些解釋。

!語法是延遲擴展等效的%和僅用於與環境變量,與循環變量和使用命令行參數。需要延遲擴展,因爲我們在括號內。括號內的塊在開始執行之前會被完全解析,因此所有%var%表達式在塊開始之前展開(評估),並且在整個塊的執行過程中不會更改。這不適合我們,因爲我們需要在塊執行期間爲變量分配不同的值,並且必須在塊內讀取值。從名稱延遲擴展如下,延遲變量的擴展,直到引用該變量的每個單個命令的實際執行。由於即時擴展仍可與延遲擴展一起使用,因此引入了一種不同的語法,即圍繞變量名稱的!,而不是%

!folder:adobe=!表示評估folder用空字符串替換每個出現的adobe。然後將該表達式的結果與(未改變的)值folder進行比較。如果匹配,則替換不會發生,這意味着首先在folder的值中沒有adobe。在這種情況下,我們不應該做任何事但是如果有不是的匹配,即如果修改的值與未修改的值不匹配,那麼我們應該設置AntiVirus1變量。這就是爲什麼在比較前有NOT

/I選項只是意味着不區分大小寫的比較。

+0

感謝您向我展示錯誤的語法。我已經清理了它,但是當腳本結束時,我的AntiVirus1 var始終是「初始值」。有條件聲明需要改變嗎?我使用「adobe」而不是「mcafee」,因爲這是我可以測試的文件夾。我的新代碼在原始文章中。 – KongMD

+0

@KongMD:請檢查我的更新。 –

+0

所以,如果我正確地理解了這一點,'!folder:adobe =!'語句都會找到adobe **的任何實例,而**會將其替換到本地變量'folder'中?如果文件夾名稱中的子字符串與「文件夾」變量中的任何字符匹配,則%AntiVirus1%將被更改。 我剛剛得到了一些有關語法的小問題。我認爲冒號是創建標籤的符號?另外,DOS如何知道'!folder:adobe =!'結尾的等號不是要搜索的字符串(在本例中爲「adobe」),如果它沒有被空格分開? – KongMD

相關問題