如果我没有正确地提出这个问题,我是一个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
答案 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
子句是多余的,但无害。
var
和anothervar
数组设置为服务器名和ipaddresses - 即使您不使用它们。
:runbkup
- 因此就子例程而言,它们显示为%1
和%2
,因此例程的%%a
将被{{%1
替换{}}和%%b
%2
除此之外,正如你所做的那样 - 遗漏了2<&1
,将(>>
)附加到日志中,并给出rename
你明显想要的目的地名称。
我会引起你对VCBMOUNTER
行的注意 - 我对该应用程序没有任何经验,但原版中的序列“-m`nbd”让我感到困惑。很不寻常。
HTH