2013-11-21 25 views
1

我有一個腳本,可以搜索某些目錄併爲給定的目錄設置路徑列表,現在我想從它們中排除一些反覆出現的不需要的目錄。設置也沒有工作內循環for Windows DOS cmd

這裏的腳本

@ECHO off 

setlocal enableextensions 
:start 
set scriptname=%0% 
set PAUSE_ON_ERROR=yes 

rem # 
rem ###### SECTION TO CUSTOMIZE ##### 
rem # 

rem # 
rem # This is the list of directories where instances of TECSYS iTopia installed under 
rem # JBoss are located. 
rem # 

set jboss_dir_list=C: C:\TecsysDev\iTopiaControlPanel\trunk 

rem # 
rem ###### END SECTION TO CUSTOMIZE ##### 
rem # 

set argNb=0 
for %%x in (%*) do Set /A argNb+=1 
if %argNb% GTR 1 (
    goto :showUsage 
) else if %argNb% == 0 (
    set ENV_NAME=* 
) else (
    set ENV_NAME=*%~1* 
) 


:MainBlock 
set scriptname=%0% 
cd /d %~dp0 
for /f "usebackq delims=" %%D in (`cd`) do set scriptdir=%%D 

for /f "usebackq delims=" %%D in (`cd`) do set CURRENT_DIR=%%D 
cd "%scriptdir%" 
for /f "usebackq delims=" %%D in (`cd`) do set JBOSS_DIR=%%D 
set JBOSS_DIR=%JBOSS_DIR%\..\..\..\..\.. 
cd "%JBOSS_DIR%" 
for /f "usebackq delims=" %%D in (`cd`) do set JBOSS_DIR=%%D 
cd "%CURRENT_DIR%" 

rem Make sure that we have the findstr utility installed. 

set findstr_found= 
for /f "usebackq" %%f in (`echo x ^| findstr x 2^>nul`) do set findstr_found=%%f 
if "X%findstr_found%" == "X" (
    echo The findstr utility is not found. 
    goto pauseforError 
) 

call :getJbossVersion 

rem prepare the list of special JBoss environments to exclude 

if /i "%JBOSS_VERSION%" lss "5" (
    set env_to_exclude=all default minimal 
) else if /i "%JBOSS_VERSION%" lss "6" (
    set env_to_exclude=all default minimal standard web 
) else (
    set env_to_exclude=all default minimal jbossweb-standalone standard 
) 

rem find the environment directories 
setlocal enabledelayedexpansion 
Set Count=1 
for %%f in (%jboss_dir_list%) do ( 
    for /f "delims=" %%G in ('dir /b /ad "%%~f\jboss*"') do (
     if exist "%%f\%%G\server\%ENV_NAME%" (
      for /f "delims=" %%H in ('dir /b /ad "%%~f\%%~G\server\%ENV_NAME%"') do (
       echo count est !count! 
       call :concat %%~f\%%~G\server\%%~H 
       Set /A Count+=1 
      ) 
     ) 
    ) 
) 


rem echo %ENV_NAME% 
rem %jboss_home_list% 

:concat 

echo the environment is %1 
set is_env_to_exclude=no 

for %%L in (%env_to_exclude%) do (
set is_env_to_exclude=no 
    for /f "usebackq delims=" %%U in (`echo %1 ^| findstr %%L`) do (
     set is_env_to_exclude=yes    
     echo flag du Ellouze 
    ) 
) 
echo %is_env_to_exclude% 

rem echo %is_env_to_exclude% 
rem set jboss_home_list=%1 %jboss_home_list% 
goto :eof 

:getJbossVersion 

for /f "usebackq tokens=2" %%v in (`echo. ^| %JBOSS_DIR%\bin\run.bat -V ^|^
            findstr "JBoss" ^| findstr /i /v "BootStrap"`) do (
    set JBOSS_VERSION=%%v 
) 

goto :EOF 

:showUsage 

echo Usage: tish [environment] 
    echo     ^| 
    echo     +--- installed environment 


rem SET /P uname=Please enter your name: 
rem IF "%uname%"=="" GOTO Error 
rem ECHO Hello %uname%, Welcome to DOS inputs! 
rem GOTO End 
rem :Error 
rem ECHO You did not enter your name! Bye bye!! 

:pauseforError 
if "%PAUSE_ON_ERROR%" == "yes" pause 
:End 

我的想法是通過做filetring:CONCAT子程序,問題設置is_env_to_exclude = YES insrtuction裏面的for循環不工作,當我執行該腳本回顯標誌正在顯示,但set is_env_to_exclude總是設置爲no。

+0

您是否可以將您的示例簡化爲一個簡短的腳本,該腳本可以在不依賴特定外部文件或目錄樹的情況下重現問題?如果你正在談論包含'set is_env_to_exclude = yes'的循環,我不認爲delayedExpansion會有幫助,因爲首先沒有擴展。 –

+0

你確實需要檢查findstr是否存在? – npocmaka

回答

0

這的確取決於env_to_exclude的內容。

is_env_to_exclude將被設置爲無每個%%L,所以即使它被設置爲yes一次,如果有,它已經設置後處理更多的元素,它會被重新設置爲no。

set is_env_to_exclude=no 
在循環

好像是罪魁禍首;刪除它似乎解決了這個問題。

AAMOI,set "flag="set flag=Y允許if [not] defined flag這具有附加的優點,即該標誌的當前狀態是FOR環內可用的,而無需enabledelayedexpansion

1

我想你需要的是打破循環:

echo the environment is %1 
set is_env_to_exclude=no 

for %%L in (%env_to_exclude%) do (
set is_env_to_exclude=no 
    for /f "usebackq delims=" %%U in (`echo %1 ^| findstr %%L`) do (
     set is_env_to_exclude=yes    
     echo flag du Ellouze 
     goto :break_loop 
    ) 
) 
:break_loop 
echo %is_env_to_exclude% 

因爲在每次迭代過%env_to_exclude%項目is_env_to_exclude設置爲no。 儘管代碼對我來說有點複雜:)