2010-07-08 27 views
1

我正在尝试为我的ESXi服务器创建备份脚本,并且遇到了一些问题。如何使两个批处理文件变量回显为单行?

我需要循环这两个命令,然后将它们写入一个文本文件,我称之为backup.list。它将包含我需要返回的所有VM ID和VM名称。

当我有两个循环命令对服务器运行时,他们只返回最后一个值,我知道有一些我失踪,但我不是很明智,即使批处理。

下面是代码:

@ECHO OFF 
SET PLINK=C:\Plink.exe 
SET ESXHOST=esx01.example.com 
SET USERNAME=root 
SET PASSWORD=password 
SET DATASTORE=/vmfs/volumes/datastore3 
IF EXIST Backup.list DEL Backup.list 
TYPE NUL>Backup.list 
SETLOCAL EnableDelayedExpansion 
FOR /F "SKIP=1 TOKENS=1" %%A IN ('%PLINK% %USERNAME%@%ESXHOST% -pw %PASSWORD% vim-cmd vmsvc/getallvms') DO SET ID=%%A 
FOR /F "SKIP=1 TOKENS=2" %%B IN ('%PLINK% %USERNAME%@%ESXHOST% -pw %PASSWORD% vim-cmd vmsvc/getallvms') DO SET VM=%%B 
ECHO !ID!:!VM! 
PAUSE 
+0

后自动:要格式化代码块,它缩进4个空格,或选择它并单击编辑器工具栏上的代码按钮。请参阅[如何格式化我的代码块?](http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks) – Helen 2010-07-08 16:46:02

回答

3

你需要一个循环

FOR /F "SKIP=1 TOKENS=1,2" %%A IN ('%PLINK% %USERNAME%@%ESXHOST% -pw %PASSWORD% vim-cmd vmsvc/getallvms') DO (
SET ID=%%A 
SET VM=%%B 
ECHO !ID!:!VM! 
) 

FOR命令只能通过DO后的单个语句循环 - 你需要的支架告诉它,它是一个复合声明。此外,为了%% B中的分配首先发生的令牌被塞进一个%%

你或许应该也省略SETLOCAL EnableDelayedExpansion并直接通知你做

FOR /F "SKIP=1 TOKENS=1,2" %%A IN ('%PLINK% %USERNAME%@%ESXHOST% -pw %PASSWORD% vim-cmd vmsvc/getallvms') DO ECHO %%A:%%B 
+1

顺便说一句,您可以删除'set'命令并使用'echo %% A:%% B' – Helen 2010-07-08 16:53:38

+0

惊人的效果! 非常感谢! – ianc1215 2010-07-09 16:33:12

相关问题