我是编程新手。这是我的困境。我必须在多台计算机上的多个位置替换多个文件。
我编写了一个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文件的最后一行。即。它写着“Apple,Potato,Pork”并将DEST设为值。
我真正想要的是阅读第1行(Apple,Potato,Beef)使用这些参数设置DEST并更改文件,然后返回并阅读第二行(Apple,Potato,Pork)并使用DEST设置DEST这些参数并更改文件。
答案 0 :(得分:0)
实际上你的代码正在读取文件中的每一行,但你的逻辑是错误的。
您的主要问题是您想为每一行执行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