1

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

我编写了一个 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 文件的最后一行。IE。它读取“Apple,Potato,Pork”并将 DEST 设置为该值。

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

4

1 回答 1

0

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

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

您的另一个问题是您试图在带括号的块中设置一个变量,然后使用%var%- 这无法访问该值,因为在解析语句时会发生扩展,并且在读取任何行之前解析整个块一次。您可以通过使用延迟扩展来解决该问题(HELP SET从命令行提示符键入有关延迟扩展的更多信息)。但实际上没有必要将值保存在变量中。只需直接使用 FOR 变量。因为 DEST 被多次使用,所以我使用了一个额外的 FOR 循环来定义一个%%d包含 DEST 值的变量。~删除 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
于 2012-10-18T21:40:18.183 回答