Windows 使用for循环输入多个数据

Windows 使用for循环输入多个数据,windows,batch-file,Windows,Batch File,我是编程新手。这是我的困境。我必须在多台计算机的多个位置替换多个文件 我已经编写了一个bat脚本,其中定义了所有变量,并调用了一个包含适当信息的txt文件。例如-testing.txt具有以下值: Apple, Potato,Beef Apple, Potato,Pork 我应用的逻辑如下:我使用这个txt文件进行读取,然后到每个位置更改文件 set Path=%Path%;c:\Tools\UnxUtils\usr\local\wbin SET SORC=C:\tools\logosourc

我是编程新手。这是我的困境。我必须在多台计算机的多个位置替换多个文件

我已经编写了一个bat脚本,其中定义了所有变量,并调用了一个包含适当信息的txt文件。例如-testing.txt具有以下值:

Apple, Potato,Beef
Apple, Potato,Pork
我应用的逻辑如下:我使用这个txt文件进行读取,然后到每个位置更改文件

set Path=%Path%;c:\Tools\UnxUtils\usr\local\wbin
SET SORC=C:\tools\logosource\NEWImages\ApiSite\Content

for /F "usebackq delims=, tokens=1-3" %%a in (C:\tools\xxxx\testing.txt) do (
SET HOSTNAME=%%a
SET CUSTNAME=%%c
SET STYPE=%%b
SET DEST=\\%HOSTNAME%\c$\Documents and Settings\blahblah\My    Documents\%CUSTNAME%\%STYPE%\goodman\

echo HOSTNAME is %HOSTNAME%
echo CUSTNAME is %CUSTNAME%
echo STYPE is %STYPE%
echo DEST is %DEST%
echo SORC is %SORC%
 )

 copy "%DEST%\ApiSite\Content\images\michael.gif" "%DEST%"
 copy /b /y "%SORC%\images\george.gif" "%DEST%\ApiSite\Content\images\michael.gif"


goto End

:Error

ECHO Error! You must pass in a servername
goto End

:End
问题是我的循环只读取txt文件的最后一行。例如,上面写着“苹果、土豆、猪肉”,并将DEST设置为该值


我真正想要的是读取第1行(苹果、土豆、牛肉),使用这些参数设置DEST并更改文件,然后返回并读取第二行(苹果、土豆、猪肉),使用这些参数设置DEST并更改文件。

实际上,您的代码正在读取文件中的每一行,但您的逻辑是错误的

您的主要问题是您希望为每一行执行COPY语句,但是在循环之外有COPY语句。当然,它们只执行一次,使用的值将是文件中最后一行设置的值。解决方案是将COPY语句移动到循环中

另一个问题是,您试图在带括号的块内设置一个变量,然后使用
%var%
访问该值。这无法工作,因为在解析语句时会发生扩展,并且在读取任何行之前会对整个块进行一次解析。您可以通过使用延迟扩展来解决该问题(从命令行提示符键入
HELP SET
,以获取有关延迟扩展的更多信息)。但实际上不需要将值保存在变量中。只需直接使用FOR变量。因为DEST被多次使用,所以我使用了一个额外的FOR循环来定义一个包含DEST值的
%%d
变量。
~
删除FOR循环添加的引号

另外,通过使用
GOTO END
并在文件末尾定义
:END
标签来结束脚本。这是可行的,但在每个脚本的末尾都有一个隐式的
:EOF
标签。您只需使用
GOTO:EOF
,而无需定义标签。另一个选项是使用
EXIT/B

您有一个未调用的
:ERROR
例程-我假定您有其他未显示的代码

set Path=%Path%;c:\Tools\UnxUtils\usr\local\wbin
SET "SORC=C:\tools\logosource\NEWImages\ApiSite\Content"

for /F "usebackq delims=, tokens=1-3" %%a in (C:\tools\xxxx\testing.txt) do (
  for %%d in (
    "\\%%a\c$\Documents and Settings\blahblah\My Documents\%%b\%%b\goodman\"
  ) do (
    echo HOSTNAME=%%a
    echo CUSTNAME=%%c
    echo STYPE=%%b
    echo DEST=%%~d
    echo SORC is %SORC%
    copy "%%~d\ApiSite\Content\images\michael.gif" "%%~d"
    copy /b /y "%SORC%\images\george.gif" "%%~d\ApiSite\Content\images\michael.gif"
  )
)
exit /b

:Error
ECHO Error! You must pass in a servername
exit /b