windows - 批处理文件 - 如果存在并输出错误

标签 windows batch-file cmd

信息: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/

相关文章:

string - 用于测试脚本是否包含字母和数字以外的任何内容的批处理代码

if-statement - 当我通过管道传送到 IF 命令时会发生什么?

c++ - 二进制文件和操作系统

c++ - 在 Windows 中使用 CMake 和 clang++ 设置链接器子系统

windows - 自动恢复挂起的 Windows 进程

c# - 批处理未从控制台运行

java - 通过java代码以管理员身份从cmd运行应用程序

windows - 在重定向文件 (>output.txt) 中显示带有重音符号的字符

windows - 为什么 Windows 注册表存在?

windows - 在 const 引用上调用属性