我想循环一个文件,将变量分配给特定的标记,然后在命令行中使用变量

时间:2013-06-12 15:26:03

标签: for-loop batch-file cmd

如果我没有正确地提出这个问题,我是一个newbi并道歉,但我想循环遍历一个列表,为该列表中的特定标记分配一个变量,然后将变量传递给一个命令(每个变量使用两个变量)变量1 ???不确定我是否正确地提出问题。

WK1List1有这样的东西:

servername ipaddress
anotherservername anotheripaddress

- 批次细分是 -

::format date in yyyy-mm-dd to apply to a directory, use is
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set today=%%c-%%a-%%b)

set homedir=E:\backups
set backuplog=E:\backups\LOGS\wk1-errors.log
set WK1List1=E:\backups\Lists\Week1_VMList_1.txt


SETLOCAL EnableDelayedExpansion
SET count=1
FOR /F "tokens=1 delims= usebackq" %%a IN ("%WK1List1%") DO (
SET var!count!=%%a
SET /a count=!count!+1

SET count=1
FOR /F "tokens=2 delims= usebackq" %%b IN ("%WK1List1%") DO (
SET var!count!=%%b
SET /a count=!count!+1
call :runbkup
)

:runbkup
echo "%%a backup started on %DATE% at %TIME%" >%backuplog% 2<&1
if exist %homedir%\%%a Rename %homedir%\%%a%_temp
start "%%a" cmd /c vcbmounter.exe -h vc2.domain.local -u domain\uid -p pwd -m `nbd -a ipaddr:%%b -r %homedir%\%%a -t fullvm -M 1
if exist "%homedir%\%%a" RD "%homedir%\%%a%_temp" /Q /S
echo "%%a backup completed on %DATE% at %TIME%" >>%backuplog% 2<&1
if exist "%homedir%\%%a_temp" echo "%%a was not successful on %DATE%-pls investigate" >>%backuplog% 2<&1

ENDLOCAL

1 个答案:

答案 0 :(得分:0)

可悲的是,你似乎过于严厉地审查你的批处理方式。就目前而言,很少有意义,但这里有......

首先,您仔细设置today - 但不要使用它。

然后,您似乎想要设置var1 .. varn作为服务器名称。好吧,好的 - 但在更新计数后,你需要结束DO块 - 所以你省略了右括号。

然后 - 如果您输入省略的括号,则重复操作,并将非常相同数组var1 .. varn设置为ipaddresses。< / p>

然后你还没有使用var阵列!它不会出现在批次的其余部分。

var1设置为第1行的ipaddress,然后CALL备份例程 - 其中%%a%%b不在上下文中,因此很可能由LITERAL字符串%a%b ...

替换

现在暂时离开:runbkup,当FOR...%%b循环结束时,批次将不会像Delphi或Pascal那样终止 - 它只会通过标签收费...

转向:runbkup -

没有指向echo语句中的2<&1,并且重定向器似乎仍然在错误的方向。

>%backlog% RESTART 日志文件 - 删除原始文件并将ECHO ed文本发送给新文本。

rename命令没有目的地名称。

那么 - 我们如何应对这次火车事故呢?

嗯 - 这是批次,所以很容易。

@echo off
::format date in yyyy-mm-dd to apply to a directory, use is
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set today=%%c-%%a-%%b)
setlocal enabledelayedexpansion
set homedir=E:\backups
set backuplog=E:\backups\LOGS\wk1-errors.log
set WK1List1=E:\backups\Lists\Week1_VMList_1.txt

SET count=1
FOR /F "usebackq tokens=1,2 delims= " %%a IN ("%WK1List1%") DO (
SET var!count!=%%a
SET anothervar!count!=%%b
SET /a count=!count!+1
call :runbkup %%a %%b
)

GOTO :EOF

:runbkup
echo "%1 backup started on %DATE% at %TIME%" >>%backuplog%
if exist %homedir%\%1 Rename %homedir%\%1 %1_temp
start "%1" cmd /c vcbmounter.exe -h vc2.domain.local -u domain\uid -p pwd -m `nbd -a ipaddr:%2 -r %homedir%\%1 -t fullvm -M 1
if exist "%homedir%\%1" RD "%homedir%\%1_temp" /Q /S
echo "%1 backup completed on %DATE% at %TIME%" >>%backuplog%
if exist "%homedir%\%1_temp" echo "%1 was not successful on %DATE%-pls investigate" >>%backuplog%
GOTO :eof

[我没试过这个 - 但它应该有效]

此版本使用tokens=1,2选择从文件读取的行上的第一个和第二个标记。我个人倾向于首先放置usebackq,以便它不会给delims一个字符序列在拼写错误的情况下用作分隔符。默认分隔符是空格,制表符,逗号,分号 - 因此delims子句是多余的,但无害。

varanothervar数组设置为服务器名和ipaddresses - 即使您不使用它们。

使用两个参数调用

:runbkup - 因此就子例程而言,它们显示为%1%2,因此例程的%%a将被{{%1替换{}}和%%b %2

除此之外,正如你所做的那样 - 遗漏了2<&1,将(>>)附加到日志中,并给出rename你明显想要的目的地名称。

我会引起你对VCBMOUNTER行的注意 - 我对该应用程序没有任何经验,但原版中的序列“-m`nbd”让我感到困惑。很不寻常。

HTH