2016-05-16 68 views
0

我正在編寫腳本來使用批處理腳本遍歷文件夾中的所有文件。我使用的命令是批處理腳本中的循環參數名稱

for /r F:\foo\ %%i in (bar_*.txt) do echo %%i

這一切正常。但是,如果將%%i替換爲%%files,則會出現%files was unexpected at this time錯誤。 documentation page表示只允許單個字符。這背後的原因是什麼?有什麼方法可以給變量賦予更有意義的名字?

+2

單字母變量的原因:'for'是這樣編程的。更有意義的名稱:不,但可以使用副本:'set files = %% i'。要使用它,你需要[延遲擴展](http://stackoverflow.com/a/30284028/2152082):'echo!file!' – Stephan

+1

的原因是[連續令牌](http:// ss64。 com/nt/for_f.html)'if for/f'。在這種情況下,命令將令牌輸出分割爲令牌,並訪問下一個需要使用字母表中的下一個字母。這對於單詞是不可能的。 – npocmaka

+0

@Stephan你的答案和鏈接解決了我的多個問題。關於延遲擴展的答案很有幫助,並且易於理解 – mahacoder

回答

0

由於tokens=1,4,6-9特性,循環變量必須是單個字符變量,這對於具有任何名稱的循環變量來說是不可能的。

例如從CSV文件input.csv) the first data column, the fourth data column and the data columns six to nine should be written into CSV file output.csv`。

@echo off 
if not exist "input.csv" exit /B 
if exist "output.csv" del "output.csv" 
for /F "usebackq tokens=1,4,6-9 delims=," %%A in ("input.csv") do (
    echo %%A,%%B,%%C,%%D,%%E,%%F>>"output.csv" 
) 

而且這將是非常困難的Windows命令處理器引用循環變量和環境變量,如果循環變量可以有任何名稱區分。

您可以始終將循環變量的值分配給環境變量,並在循環內的其他命令行上使用延遲擴展使用該環境變量。

@echo off 
setlocal EnableDelayedExpansion 
for /R F:\foo\ %%# in (bar_*.txt) do (
    set "FileName=%%#" 
    echo Current file is: !FileName! 
) 
endlocal 

注意:這僅適用於每個數據行中沒有空字段值的情況。

環境變量不區分大小寫,但循環變量區分大小寫。當使用%~nI,%~nxI或類似的東西時,避免使用小寫字母作爲循環變量,因爲這可能會產生問題。

BTW:爲什麼不使用COPY與選項/SXCOPYROBOCOPY遞歸複製通配符模式bar_*.txt匹配的所有文件?