2014-02-27 93 views
2

我正在嘗試設置幾個從變量「FOR/F」命令,總是得到「ECHO處於關閉狀態」當我附和他們:無法設置變量,「FOR」命令

IPST。 txt文件:

1  10.1.1.10 
3  10.1.3.10 
8  10.1.3.10 

批處理文件:

@ECHO OFF 
set Computerslist=ipst.txt 

for /f "tokens=1,2" %%A in (%Computerslist%) do (
    set StationNumber=%%A 
    set StationIP=%%B 
    echo %StationNumber% 
    echo %StationIP% 
    ) 

結果是:

ECHO is off. 
ECHO is off. 

該問題阻止我採取變量,並使用更多的循環。 需要你的幫助:)

+1

你引用的「壞」的行爲作爲輸出是不正確的?這可能是因爲第1行('@ECHO OFF')? – ConcurrentHashMap

+0

您的問題是可變擴展。延遲擴展是必要的。請參閱[這裏](http://stackoverflow.com/a/21725323/2861476)。在需要的地方使用'setlocal enabledelayedexpansion'並用'!var!'替換'%var%'。 –

+0

仍然不能正常工作 –

回答

4

MC ND是正確的。選擇以下兩種方式之一:

@ECHO OFF 
set Computerslist=ipst.txt 

for /f "tokens=1,2" %%A in (%Computerslist%) do (
    set "StationNumber=%%A" & echo.%%A 
    set "StationIP=%%B" & echo.%%B 
    ) 

@ECHO OFF 
setlocal enabledelayedexpansion 
set Computerslist=ipst.txt 

for /f "tokens=1,2" %%A in (%Computerslist%) do (
    set StationNumber=%%A 
    set StationIP=%%B 
    echo.!StationNumber! 
    echo.!StationIP! 
    ) 
+1

爲了completetness第三種方式'call echo(%% StationID %%' – jeb

1
@ECHO OFF 
    setlocal enableextensions enabledelayedexpansion 

    set "Computerslist=ipst.txt" 

    for /f "tokens=1,2 usebackq" %%A in ("%Computerslist%") do (
     set "StationNumber=%%A" 
     set "StationIP=%%B" 
     echo !StationNumber! 
     echo !StationIP! 
    ) 

但是,正如在評論中指出的,如果改變變量裏面對變量的改變塊訪問時,才需要延遲擴展。所以,這個代碼

@ECHO OFF 
    set "Computerslist=ipst.txt" 

    for /f "tokens=1,2 usebackq" %%A in ("%Computerslist%") do (
     set "StationNumber=%%A" 
     set "StationIP=%%B" 
    ) 
    echo %StationNumber% 
    echo %StationIP% 

在此,訪問變量值不會在它在那裏改變,需要的話,沒有延遲擴展相同的塊來完成。

EDITED - 如註釋中所述,這最後的代碼不會列出文件中的所有行。作爲它們上面的for循環,以前的值將被覆蓋,變量只保留最後一個賦值,並將被回顯到控制檯。我的錯,選擇了不好的樣品。

+0

當然,在第二個示例中,您只會顯示Computerslist中最後一個項目的結果...如果只有一個項目,那麼結果很好。 OP將不得不重新考慮。 – RGuggisberg

+0

@Ruggisberg,你是對的。我的錯不能更好地解釋它。要改變答案。謝謝 –