0

I am a newbi and apologize if I am not asking the question correctly, but I want to loop through a list, assigning a variable to specific tokens in that list, then pass the variables to a command (using both variables for each variable 1??? Not sure if I am asking the question properly.

The WK1List1 has something like this:

servername ipaddress
anotherservername anotheripaddress

-- batch segment is --

::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
4

1 回答 1

0

可悲的是,您似乎对您的批次进行了过于严格的审查。就目前而言,没什么意义,但这里有......

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

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

然后 - 如果您输入省略的括号,您将重复该操作,并将VERY SAME数组var1..varn设置为 ipaddresses。

那么你var无论如何都没有使用数组!它不会出现在批次的其余部分中。

设置var1为第 1 行的 ipaddress 后,您将CALL执行备份例程 - where%%a%%bare out-of-context,因此可能会被 LITERAL 字符串替换,%a并且%b...

现在暂时不要管它:runbkup,当FOR...%%b循环结束时,批处理不会像 Delphi 或 Pascal 那样终止——它只会通过标签充电......

转向:runbkup——

在 echo 语句中没有任何意义2<&1,并且重定向器似乎在错误的方向上。

重新启动日志文件 - 删除原始文件并将>%backlog%编辑文本发送到新文件。ECHO

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子句是多余的,但无害。

和数组设置为服务器名称varanothervarIP 地址——即使您不使用它们。

:runbkup用两个参数调用 - 所以这些出现在子例程中,所以例程被替换为%1%2%%a%1%%b%2

除此之外,正如您所拥有的那样 - 省略2<&1, 将 ( >>) 附加到日志并给出rename您显然想要的目标名称。

我会提请您注意这VCBMOUNTER行 - 我没有使用该应用程序的经验,但是原始中的序列“-m `nbd”让我感到困惑。很不寻常。

高温高压

于 2013-06-12T17:09:24.647 回答