Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
For loop 我想循环一个文件,将一个变量分配给特定的令牌,然后在命令行中使用这些变量_For Loop_Batch File_Cmd - Fatal编程技术网

For loop 我想循环一个文件,将一个变量分配给特定的令牌,然后在命令行中使用这些变量

For loop 我想循环一个文件,将一个变量分配给特定的令牌,然后在命令行中使用这些变量,for-loop,batch-file,cmd,For Loop,Batch File,Cmd,我是一个新手,如果我问的问题不正确,我很抱歉,但我想循环一个列表,将一个变量分配给该列表中的特定标记,然后使用每个变量的两个变量将变量传递给命令1???不确定我问的问题是否正确 WK1List1有如下内容: servername ipaddress anotherservername anotheripaddress -批段为- ::format date in yyyy-mm-dd to apply to a directory, use is For /f "tokens=2-4 deli

我是一个新手,如果我问的问题不正确,我很抱歉,但我想循环一个列表,将一个变量分配给该列表中的特定标记,然后使用每个变量的两个变量将变量传递给命令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

遗憾的是,您似乎对批处理进行了太严格的审查。就目前而言,没什么意义,但接下来

首先,您今天仔细地设置了它,但不要使用它

然后,您似乎希望将var1..varn设置为服务器名。好的,好的-但是在更新计数之后,您需要结束DO块-因此您省略了右括号

然后-如果插入省略的括号,则重复该操作,并将同一数组var1..varn设置为IPAddress

那你就不用var数组了!它不会出现在批处理的其余部分中

将var1设置为第1行的ipaddress后,您可以调用备份例程,其中%%a和%%b与上下文无关,因此可能会被文本字符串%a和%b替换

现在离开:目前运行良好,当for…%%b循环完成时,批处理不会像Delphi或Pascal那样终止-它将通过标签继续运行

转向:runbkup-

没有指向2%积压%的点将重新启动日志文件-删除原始文本并将回显文本发送到新文本

重命名命令没有目标名称

那么,我们如何处理这起火车失事事件呢

嗯,这是批量生产的,所以很容易

@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数组被设置为servername和ipaddress,即使您不使用它们

:runbkup使用两个参数调用-因此就子例程而言,这些参数显示为%1和%2,因此例程的%%a被%1替换,%%b被%2替换

除此之外,正如您所做的那样,在日志中省略了2>,并为重命名提供了您显然想要的目的地名称

我想提请您注意VCB计数器行-我没有使用该应用程序的经验,但原始版本中的序列-m`nbd让我感到困惑。非常不寻常


HTH

请显示您列表的一部分以及您需要分离代币的位置。非常感谢您,我将尝试一下。我知道这是一场火车失事,因为它显然是由零碎的知识拼凑而成的。我只是不明白如何将文本中的变量设置传递到命令行。我会让你知道事情的进展。vcbmounter也是一个vcb命令,用于整合虚拟机备份。