2014-07-03 201 views
1

我有一個Windows批處理文件讀取文件,從它那裏得到一些信息,比如機器的IP,然後打印一些註冊表值,這臺機器,這樣的事情:內Windows批處理轉到FOR循環

for /f "skip=1 tokens=1,2,3,4,5,6,* delims=;" %%a in ('findstr /R "^" z:\csp\levantamento\levantamentoNOVO.csv') do (

set /A "HOME=0" 

:cicle 
echo HOME%HOME% 
echo \\%%c\HKLM\SOFTWARE\ORACLE\HOME%HOME% 

reg query \\%%c\HKLM\SOFTWARE\ORACLE\HOME%HOME% /v ORACLE_HOME 

if %HOME% leq 3 (
    set /A "HOME+=1" 
    goto cicle 
) else (
    echo. 
) 

echo Conenction to %%a deleted 
) 

和我的輸出是這樣的:

 
HOME0 
\\10.13.3.27\HKLM\SOFTWARE\ORACLE\HOME0 

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0 
    ORACLE_HOME REG_EXPAND_SZ d:\oracle\806 

HOME1 
\\%c\HKLM\SOFTWARE\ORACLE\HOME1 
ERROR: The network path was not found. 
HOME2 
\\%c\HKLM\SOFTWARE\ORACLE\HOME2 
ERROR: The network path was not found. 
HOME3 
\\%c\HKLM\SOFTWARE\ORACLE\HOME3 
ERROR: The network path was not found. 
HOME4 
\\%c\HKLM\SOFTWARE\ORACLE\HOME4 
ERROR: The network path was not found. 


Conenction to %a deleted 

當我做了轉到cicle,看起來好像是FOR循環不知道了帽子%% c和%% c是。我真的不知道我做錯了什麼。

+0

如果在'for'循環中使用'goto'命令,'for'被取消,不會有更多迭代,'for'可替換參數/變量超出範圍。 –

+0

好吧...不知道那個.... –

+0

那麼,有沒有辦法做我想要的? –

回答

2

嘗試

for /f "skip=1 tokens=1,2,3,4,5,6,* delims=;" %%a in ('findstr /R "^" z:\csp\levantamento\levantamentoNOVO.csv') do (

set /A HOME=0 
call :cicle "%%a" "%%c" 
) 

:: what-to-do-after-for goes in here 

goto :eof 

:cicle 
echo HOME%HOME% 
echo \\%~2\HKLM\SOFTWARE\ORACLE\HOME%HOME% 

reg query \\%~2\HKLM\SOFTWARE\ORACLE\HOME%HOME% /v ORACLE_HOME 

if %HOME% leq 3 (
    set /A HOME+=1 
    goto cicle 
) 
echo. 

echo Connection to %~1 deleted 
goto :eof 

注意,現在有一個叫做cicle子程序這與參數"%%a""%%c"cicle常規供貨,究竟是什麼%%a成爲%~1(第一個參數,減去引號),什麼是%%c變爲%~2(第二個參數,減去引號)。

只有當傳遞的參數包含分隔符時,引號纔會出現,這在當前情況下不太可能發生。

從提示docco的call /?

還請注意set "var=variable"用於字符串賦值以確保不需要的尾部空格不包含在賦值中。 set /a語法不會遇到這個問題,所以兔子的耳朵是沒有必要的。

+0

MC ND答案當場!最好的方法是做一個for/l循環 –