2014-02-14 3 views
1

INFO: assets.txt содержит список имен процессора, с которыми я могу подключиться по сети.ФАЙЛ BATCH - IF Exists & Output Error

Мне нужно скопировать этот новый .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, где случилась ошибка?

Спасибо вам заблаговременно за ваше время.

+0

Откуда появляется сообщение об ошибке? Какая ошибка? – foxidrive

+0

Я хочу уловить ошибки из копии файла. Ваше решение работает отлично. Благодаря! – Drew

ответ

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: вызвать внутренний чтобы использовать мофилизованное значение как %file%

Решение 4. Создайте каталог независимо. MD newname 2>nul будет тихо создавать новый каталог, если он еще не существует

+0

Спасибо большое! – Drew

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"