1

您好我有以下要求
一个批处理文件,通过提示用户从命令行提供输入来将三个参数作为输入

1) 服务器名
2) 开始日期
3) 结束日期

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

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 机器

4

3 回答 3

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 命令。

于 2013-10-16T21:13:36.477 回答
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
于 2013-10-16T23:36:54.160 回答
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-in-do 循环中使用,它读取 data.csv 以回显输入的数据集。

第二行删除data.csv(如果存在),这样之前的数据集就不会被重用。

于 2013-10-17T03:57:58.307 回答