信息:assets.txt 包含我可以通过网络连接到的 cpu 名称列表。
我需要将这个新的 .exe 复制到 200 多台计算机上,我想我可以使用 c$ 管理共享。这确实是我可以做到这一点的唯一方法,而无需单独前往工作站或一个一个地进行远程处理。
此脚本在没有“如果存在”的情况下工作,但我需要在尝试复制之前检查目录是否存在。我不明白为什么它不起作用。我还使用我的域管理帐户运行此脚本。
@echo off
REM Pull Computer Asset Tags from file
for /F "tokens=*" %%A in (assets.txt) do (
echo Start Processing %%A
REM Temporarily set file path for existence check
set file=\\%%A\C$\Program Files\Intouch2\Intouch2ca.exe
if EXIST "%file%" (
REM Rename old .exe
ren "\\%%A\C$\Program Files\Intouch2\Intouch2ca.exe" "Intouch2ca.bak"
REM copy new .exe from server to cpu asset
xcopy "\\server\my dir\management\it\software\Intouch Upgrade\Intouch2ca.exe" "\\%%A\C$\Program Files\Intouch2\" /Y
echo END Processing %%A
echo.
echo ------------------------------------------------------------
echo.
)
)
我也无法将错误输出到日志文件。 我已经尝试过了,但这并不是我想要的。
xcopy "\\server\my dir\management\it\software\Intouch Upgrade\Intouch2ca.exe""\\%%A\C$\Program Files\Intouch2\"/Y 1>>错误.log 2>&1
我怎样才能让它只显示错误并列出发生错误的 %%A
?
提前感谢大家的宝贵时间。
最佳答案
在 block 语句(括号中的一系列语句)
中,整个 block 被解析并然后执行。 block 中的任何 %var%
都将被该变量的值替换在 block 被解析时 - 在 block 被执行之前。
因此,在您的情况下,file
正在 block 中更改,因此 cmd
使用的值是其初始值,当整个for
被解析。
解决方案 1:使用 \\%%A\C$\Program Files\Intouch2\Intouch2ca.exe
代替 %file%
解决方案 2:在 @echo off
之后的单独一行中使用 setlocal enabledelayedexpansion
开始您的批处理,然后使用 !file!
%var%
解决方案 3:调用内部例程以将修改后的值用作 %file%
解决方案 4:无论如何创建目录。 MD newname 2>nul
将静默创建一个新目录(如果它不存在)
关于windows - 批处理文件 - 如果存在并输出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21782742/