我正在編寫腳本來使用批處理腳本遍歷文件夾中的所有文件。我使用的命令是批處理腳本中的循環參數名稱
for /r F:\foo\ %%i in (bar_*.txt) do echo %%i
這一切正常。但是,如果將%%i
替換爲%%files
,則會出現%files was unexpected at this time
錯誤。 documentation page表示只允許單個字符。這背後的原因是什麼?有什麼方法可以給變量賦予更有意義的名字?
我正在編寫腳本來使用批處理腳本遍歷文件夾中的所有文件。我使用的命令是批處理腳本中的循環參數名稱
for /r F:\foo\ %%i in (bar_*.txt) do echo %%i
這一切正常。但是,如果將%%i
替換爲%%files
,則會出現%files was unexpected at this time
錯誤。 documentation page表示只允許單個字符。這背後的原因是什麼?有什麼方法可以給變量賦予更有意義的名字?
由於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與選項/S
或XCOPY或ROBOCOPY遞歸複製通配符模式bar_*.txt
匹配的所有文件?
單字母變量的原因:'for'是這樣編程的。更有意義的名稱:不,但可以使用副本:'set files = %% i'。要使用它,你需要[延遲擴展](http://stackoverflow.com/a/30284028/2152082):'echo!file!' – Stephan
的原因是[連續令牌](http:// ss64。 com/nt/for_f.html)'if for/f'。在這種情況下,命令將令牌輸出分割爲令牌,並訪問下一個需要使用字母表中的下一個字母。這對於單詞是不可能的。 – npocmaka
@Stephan你的答案和鏈接解決了我的多個問題。關於延遲擴展的答案很有幫助,並且易於理解 – mahacoder