批量文件 - 如果存在&输出错误

时间:2014-02-14 15:03:56

标签: windows batch-file cmd

INFO:assets.txt包含我可以通过网络连接的cpu名称列表。

我需要将这个新的.exe复制到超过200多台计算机上,并认为我可以使用c $ admin共享。这是我无法单独前往工作站或逐个远程操作的唯一方法。

此脚本在没有'if exists'的情况下工作,但我需要在尝试复制之前检查目录是否存在。我不明白为什么它不起作用。我也使用我的域管理帐户运行此脚本。

@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>>errors.log 2>&1

我该怎么做才能显示错误并列出发生错误的%%A

提前感谢您的所有时间。

2 个答案:

答案 0 :(得分:2)

副本上的错误将设置错误级别,您可以编写自定义错误消息。

copy "\\server\my dir\management\it\software\Intouch Upgrade\Intouch2ca.exe" "\\%%A\C$\Program Files\Intouch2\" >nul 2>&1
if errorlevel 1 >> errors.txt echo "Error in %%A"

答案 1 :(得分:2)

在块语句(a parenthesised series of statements)中,解析整个块并执行然后。在执行块之前,块中的任何%var%将被解析块时的变量值替换

因此,在您的情况下,file正在 块中进行更改,因此cmd使用的值是整个for时的初始值解析。

解决方案1:使用\\%%A\C$\Program Files\Intouch2\Intouch2ca.exe代替%file%

解决方案2:在setlocal enabledelayedexpansion之后的另一行开始使用@echo off批处理,然后使用!file!代替%var%

解决方案3:调用内部例程以将mofified值用作%file%

解决方案4:无论如何创建目录。 MD newname 2>nul将静默创建一个新目录(如果该目录尚不存在)