[英]Using Windows Batch Script Can I Use A For Loop To Iterate Multi-Line File And Run Multiple Commands
我想迭代一個包含Windows目錄列表的純文本文件,並針對每行運行多個命令,將每行分配給一個變量。 然后,我想將每個命令的每個結果輸出回送到以逗號分隔的文件中。 是的,我知道批處理編程可能不是最佳選擇,但目前有所限制。 這是我要面對的地方:
@echo off
setlocal
SETLOCAL ENABLEDELAYEDEXPANSION
:: There could be spaces in the filename, thus using delims
FOR /f "delims=?" %%a in (e:\multiline_textfile.txt) do (
set filename=%%a
CALL :PROG1
CALL :PROG2
CALL :PROG3
CALL :ENDPROG
:PROG1
FOR /f "delims=?" %%h in ('e:\apps\exe1.exe -s "!filename!"') do set result11=%%h
:PROG2
FOR /f "delims=?" %%i in ('e:\apps\exe1.exe -b"!filename!"') do set result2=%%i
:PROG3
FOR /f "delims=?" %%j in ('e:\apps\exe2.exe -c "!filename!"') do set result3=%%j
:ENDPROG
echo !result1!,!result2!,!result3!
)
---
任何見識將不勝感激。
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
:: There could be spaces in the filename, thus using delims
FOR /f "delims=" %%a in (e:\multiline_textfile.txt) do (
set "filename=%%a"
CALL :PROG1
CALL :PROG2
CALL :PROG3
CALL :ENDPROG
)
echo here endeth your batch mainline
goto :eof
:PROG1
FOR /f "delims=" %%h in ('e:\apps\exe1.exe -s "!filename!"') do set "result1=%%h"
goto :eof
:PROG2
FOR /f "delims=" %%i in ('e:\apps\exe1.exe -b"!filename!"') do set "result2=%%i"
goto :eof
:PROG3
FOR /f "delims=" %%j in ('e:\apps\exe2.exe -c "!filename!"') do set "result3=%%j"
goto :eof
:ENDPROG
echo !result1!,!result2!,!result3!
goto :eof
您不需要初始的SETLOCAL
一個就足夠了。
標簽只是批處理程序中的MARKERS-它們不會影響流程。 在CALL
ed例程中返回的最常見方法是GOTO :EOF
,其中需要使用冒號,並且標簽:EOF
是隱式的,不應聲明。
試圖像這樣在FOR
循環中使用標簽的想法很糟糕。 可能適用於更高版本,但不適用於早期版本。 請注意, FOR
循環的結尾)已移動...
而!var!
可以正常工作,在這種情況下沒有必要,因為每個子例程本質上都是一個全新的程序,它繼承了CALL
處的主要環境。 因此每個!var!
可以用%var%
代替,而SETLOCAL ENABLEDELAYEDEXPANSION
只需是SETLOCAL
。 您只需要使用延遲擴展,即可在復合語句中更改后使用普通環境變量的值(例如,多行的FOR
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.