在批处理文件中写入循环动态地从命令行传递输入

时间:2013-10-16 20:51:09

标签: windows batch-file

嗨,我有以下要求 一个批处理文件,通过提示用户从命令行提供输入

,将三个参数作为输入

1)Servername
2)Startdate
3)Enddate

批处理文件应以下面的方式提示。

Prompt Enter servername
Prompt Enter startdate
Prompt Enter enddate
Prompt user to ask if want to add one more set , IF enter Y , repeats the same 3 prompts, else, starts executing execute with single dataset 
Ex:-user enters server1 , 20130101 , 20130930 
asks to enter Y or N
If Y user enters server2 , 20130101 , 20130930 ,                                         asks to enter Y or N
If N, continues with 2 datasets

现在我需要在批处理文件中编写一个for循环,在2个数据集上重复相同的逻辑 任何人都可以告诉我如何实现这一目标。 我正在使用Windows 7机器

3 个答案:

答案 0 :(得分:0)

你可能想要一个do循环而不是for循环。我们没有批处理循环,但可以使用Goto命令和Goto:Eof命令模拟一个循环。

所以输入

goto /?
set /?
choice /? (choice was removed from windows in XP or 2000, then upgraded, and put back in Vista)
if /?
call /?

所以(注意测试必须是从高到低的数字)。我也不知道你在问什么,所以我无法弄清楚Y或N究竟应该做些什么。所以N执行另一个代码块,Y重新提出问题。

:StartLoop
set /p sServerName=Enter Server Name
set /p sStartDate=Enter Start date
set /p sEndDate=Enter End date
choice /m "Enter Yes or No."
Rem Testing for N
if errorlevel 2 Goto AnotherBlockOfCode
if errorlevel 1 Goto StartLoop
goto :eof

:AnotherBlockOfCode
echo You chose No
goto :eof

如果你需要Sub而不是跳转使用call命令。

答案 1 :(得分:0)

@echo off

set counter=0

:StartLoop
set /a counter=counter + 1

set /p sServerName%counter%=Enter Server Name
rem    set /p sStartDate%counter%=Enter Start date
rem    set /p sEndDate%counter%=Enter End date

set ss

If "%counter%"=="3" Goto AnotherBlockOfCode

choice /m "Enter Yes or No."
Rem Testing for N
if errorlevel 2 Goto AnotherBlockOfCode
Rem Testing for Y
if errorlevel 1 Goto StartLoop
goto :eof

:AnotherBlockOfCode
echo.
echo.
echo You chose No or already chosen 3 servers
echo.
goto :eof

答案 2 :(得分:0)

以下是获取数据输入的另一种方法:

批处理文件告诉您如何结束数据输入,然后提示输入数据集 - 我已经显示输入了两组数据 - 然后它使用循环显示输入的数据集。

您可以输入无限数量的数据集。

这是屏幕显示:

Press enter when you have finished
Enter data in this format: servername,startdate,enddate \\server1,20010301,20010331
Enter data in this format: servername,startdate,enddate \\server2,20030102,20030103
Enter data in this format: servername,startdate,enddate

"servername=\\server1"
"startdate=20010301"
"enddate=20010331"

"servername=\\server2"
"startdate=20030102"
"enddate=20030103"

Press any key to continue . . .

以下是代码:使用评论中的额外功能进行编辑

@echo off
del data.csv 2>nul
set "MyLogFile=c:\temp3\copy.log"
set "targetdir=c:\temp3"
echo Press enter when you have finished
:loop
   set "data="
   set /p "data=Enter data in this format: servername,startdate,enddate "
      if defined data (
         >>data.csv echo %data%
         goto :loop
      )
for /f "tokens=1,2,3 delims=," %%a in (data.csv) do (
   rem echo.
   rem echo "servername=%%a"
   rem echo "startdate=%%b"
   rem echo "enddate=%%c"
  pushd "%%a"
   for %%x in (*web_feed.out.gz) do (
      for /f "delims=." %%y in ("%%x") do (
         echo comparing server "%%a" : file "%%x"
         if %%y geq %%b if %%y leq %%c (
              echo      copying "%%x"
              echo              - date range %%b to %%c and %%y found
              copy "%%x" "%targetDir%\%%x" >> "%MyLogFile%"
         )
      )
   )
  popd
 )
pause

文件data.csv用于存储数据条目集,并在for-for-do循环中使用,它读取data.csv以回显输入的数据集。

第二行删除data.csv(如果存在),以便不会重复使用上一组数据。