我想从文本文件一次设置一行变量,使用此变量运行特定命令,然后循环返回,抓住第二行,处理命令,依此类推,直到文件结束。 / p>
批处理文件运行良好并要求用户输入,然后使用输入作为变量进行处理,完全没有问题。该脚本首先获取计算机名称,然后将安装文件复制到本地机器上,使用WMIC安装MSI:
@echo off
SET /P computer=Enter Computer Name
echo.
XCopy "\\server\netlogon\temp\*.*" "\\%computer%\c$\temp\*.*" /E /C /H /R /Y
WMIC /Node:"%computer%" product call install true,"","c:\temp\msi_to_install.msi"
文本文件如下所示:
PC-01
PC-02
PC-27
Odd-PC
然而,当我尝试介绍" for"循环,这样我可以一次处理一百台或更多的机器,没有任何反应。即使我在文件中只有一行,我也无法让它工作。这就是我的尝试:
@echo off
For /F %%i in (c:\test.txt) do (
set computer=%%i
echo.
XCopy "\\server\netlogon\temp\*.*" "\\%computer%\c$\temp\*.*" /E /C /H /R /Y
WMIC /Node:"%computer%" product call install true,"","c:\temp\msi_to_install.msi"
)
对于记录,我使用%%computer%%
和!computer!
尝试了变量但没有成功。
我也在" SET"中使用或不使用/ p进行了以下操作。命令:
@echo off
SET /P computer=<"c:\test.txt"
echo.
XCopy "\\server\netlogon\temp\*.*" "\\%computer%\c$\temp\*.*" /E /C /H /R /Y
WMIC /Node:"%computer%" product call install true,"","c:\temp\msi_to_install.msi"
我很感激任何建议或意见。
答案 0 :(得分:1)
您需要参考delayed expansion
上的一些SO文章,了解其工作原理的详细信息。
要使用!var!
语法(在第一个%var%
循环中代替for
),您需要执行
setlocal enabledelayedexpansion
批处理中的早期(作为主线的一部分,而不是循环 - 例如,直接在@echo off
之后或for
循环之前)
但是,在您的情况下,由于computer
设置为%%i
,因此将%computer%
替换为%%i
应该是一种更简单的解决方案。
预期结果代码:
@echo off
setlocal enabledelayedexpansion
For /F %%i in (c:\test.txt) do (
set computer=%%i
echo.
XCopy "\\server\netlogon\temp\*.*" "\\!computer!\c$\temp\*.*" /E /C /H /R /Y
WMIC /Node:"!computer!" product call install true,"","c:\temp\msi_to_install.msi"
)
或
@echo off
For /F %%i in (c:\test.txt) do (
echo.
XCopy "\\server\netlogon\temp\*.*" "\\%%i\c$\temp\*.*" /E /C /H /R /Y
WMIC /Node:"%%i" product call install true,"","c:\temp\msi_to_install.msi"
)
答案 1 :(得分:0)
格式化输入文件并以ANSI
格式保存后,这是最终的代码:
@echo off
setlocal enabledelayedexpansion
For /F %%i in (c:\computers.txt) do (
set computer=%%i
echo.
XCopy "\\server\netlogon\temp\msifolder\*.*" "\\!computer!\c$\temp\msifolder\*.*" /E /C /H /R /Y
WMIC /Node:"!computer!" product call install true,"","c:\temp\msi_to_install.msi"
RD /S /Q "\\!computer!\c$\temp\msifolder\"
)
在我最后的脚本演示中,我正在复制MSI文件在本地的文件夹,安装MSI,然后在完成后删除文件夹。如果已安装MSI,您将收到此错误:
instance of __PARAMETERS
{
ReturnValue = 1603
要成功安装,您将获得ReturnValue = 0
@magoo在故障排除方面提供了很多指导,谢谢你,文件格式是最后一块拼图。