这是我正在尝试的代码。它导致最后一行被创建。所以我猜其他文件被覆盖了,虽然我试图移动它们并且没有工作?
for /f "usebackq tokens=1-8 delims=," %%a in ("chassisinfo.csv") do (
set hostname=%%a
set FQDN=%%b
set MGMT=%%c
set SUB=%%d
set gw=%%e
set dns=%%f
set vlan=%%g
echo # Seans scripted installation file > ks_%hostname%.cfg
echo # >> ks_%hostname%.cfg
echo # Accept the VMware End User License Agreement >> ks_%hostname%.cfg
echo vmaccepteula >> ks_%hostname%.cfg
echo # Set the root password for the DCUI and Tech Support Mode >> ks_%hostname%.cfg
echo rootpw >> ks_%hostname%.cfg
echo # The install media is in the CD-ROM drive >> ks_%hostname%.cfg
echo install --firstdisk --overwritevmfs >> ks_%hostname%.cfg
echo keyboard 'United Kingdom' >> ks_%hostname%.cfg
echo network --bootproto=static --device=vmnic0 --ip=%MGMT% --netmask=%SUB% --gateway=%gw% --nameserver=%dns% --vlanid=%vlan% --hostname=%hostname%%FQDN% >> ks_%hostname%.cfg
move ks_%hostname%.cfg d:\KSscripts\
)
答案 0 :(得分:0)
您正在为每一行重新创建文件,因为单个>在线。
echo # Seans scripted installation file > ks_%hostname%.cfg
将其更改为以下行。请注意,我还在文件名周围加上引号,以防文件名中有空格。在所有情况下都这样做是个好主意。
echo # Seans scripted installation file >> "ks_%hostname%.cfg"
然后,在开始上面代码的第一行之前,你应该在行上放一行这样的行,以确保你不会附加到旧文件。
if exist "ks_%hostname%.cfg" del /f /q "ks_%hostname%.cfg"
编辑...要跳过第一行,请将FOR语句更改为:
for /f "usebackq tokens=1-8 skip=1 delims=," %%a in ("chassisinfo.csv") do (
答案 1 :(得分:0)
您的代码不只创建最后一个文件,但是最后一个值分配给%hostname%变量的文件,也就是程序第一次运行它应该创建一个刚刚命名的文件" ks_.cfg&#34 ;.如果批处理代码没有SETLOCAL命令,那么第二次和下次运行它会创建一个名称为最后一行的文件。
原因是%hostname%变量值在执行FOR命令之前仅扩展,因此所有循环都以相同的值执行。您可以通过两种方式解决此问题:使用原始FOR可替换参数而不是变量:
for /f "usebackq skip=1 tokens=1-8 delims=," %%a in ("chassisinfo.csv") do (
echo # Seans scripted installation file > ks_%%a.cfg
echo # >> ks_%%a.cfg
. . . .
move ks_%%a.cfg d:\KSscripts\
)
或使用延迟展开:在您的计划开始时插入setlocal EnableDelayedExpansion
命令,并按%hostname%
更改所有!hostname!
次展开。有关详细信息,请查看"延迟扩展"在本网站或阅读set /?
的解释。