Поиск файла в 2х дерикториях, сравнение версии и принятие решения
Нужен скрипт, который будет искать исполняемый файл программы в C:\Program Files\%ProgrammName%\ и в С:\Users\%UserName%\appdata\roaming\%ProgrammName%\ ,
Если находится только 1 исполняемый файл - копирует дополнительные файлы из директории, где находится скрипт в директорию программы. Если находятся оба - проверяет версию и копирует файлы в папку с более новой версией программы.
Такое возможно?
|
El Sanchez |
07-09-2012 11:02 1984633 |
i-Lex, теория доказана, теперь практика:
Код:
@Echo Off
SetLocal
Set ProgrammName=MyProgramName\program.exe
If Not Exist "%ProgramFiles%\%ProgrammName%" If Not Exist "%APPDATA%\%ProgrammName%" Exit /B 1
If Exist "%ProgramFiles%\%ProgrammName%" If Not Exist "%APPDATA%\%ProgrammName%" (
:: Тут копируем файлы в %ProgramFiles%
)
If Not Exist "%ProgramFiles%\%ProgrammName%" If Exist "%APPDATA%\%ProgrammName%" (
:: Тут копируем файлы в %APPDATA%
)
If Exist "%ProgramFiles%\%ProgrammName%" If Exist "%APPDATA%\%ProgrammName%" (
Echo:Wscript.Echo CreateObject^("Scripting.FileSystemObject"^).GetFileVersion^(WScript.Arguments^(0^)^)>"%~n0_filever.vbs"
For /F "Tokens=*" %%A In ('cscript //nologo "%~n0_filever.vbs" "%ProgramFiles%\%ProgrammName%"') Do (
For /F "Tokens=*" %%B In ('cscript //nologo "%~n0_filever.vbs" "%APPDATA%\%ProgrammName%"') Do (
:: Версия файла в %ProgramFiles% новее
If "%%A" GTR "%%B" (
:: Копируем в %ProgramFiles%
)
:: Версия файла в %APPDATA% новее
If "%%B" GTR "%%A" (
:: Копируем в %APPDATA%
)
)
)
Del /F /Q "%~n0_filever.vbs" 2>nul
)
|
El Sanchez, скорее всего я не правильно применил скрипт, но скрипет ничего не выполнил.
Меня интересует строка
Код:
Set ProgrammName=MyProgramName\program.exe
В части MyProgramName\program.exe мне нужно вписать папку с программой и название самого файла программы?
Или нужно вместо %ProgrammName% прописать название папки с программой?
В обоих случая не работает(
|
El Sanchez |
09-09-2012 14:44 1985526 |
Цитата:
Цитата i-Lex
В части MyProgramName\program.exe мне нужно вписать папку с программой и название самого файла программы? »
|
i-Lex, да.
Цитата:
Цитата i-Lex
В обоих случая не работает( »
|
i-Lex, в скрипте вместо операций копирования комментарии. Я ж не знаю в каком виде у вас дополнительные файлы в директории лежат: либо только файлы в директории, либо файлы в поддиректориях, либо там и там. Если нужно скопировать все и вся, после комментариев пишете соответственно:
Код:
:: Тут копируем файлы в %ProgramFiles%
:: Копируем в %ProgramFiles%
Call XCopy /FYERH * "%ProgramFiles%\%%ProgrammName:%ProgrammName:*\=%=%%"&&Call Del /F /Q "%ProgramFiles%\%%ProgrammName:%ProgrammName:*\=%=%%%~0"
:: Тут копируем файлы в %APPDATA%
:: Копируем в %APPDATA%
Call XCopy /FYERH * "%APPDATA%\%%ProgrammName:%ProgrammName:*\=%=%%"&&Call Del /F /Q "%APPDATA%\%%ProgrammName:%ProgrammName:*\=%=%%%~0"
|
El Sanchez, тоесть я правильно понял, что всё это будет выглядеть вот так:
Код:
@Echo Off
SetLocal
Set ProgrammName=Lcx\lcx.exe
If Not Exist "%ProgramFiles%\%ProgrammName%" If Not Exist "%APPDATA%\%ProgrammName%" Exit /B 1
If Exist "%ProgramFiles%\%ProgrammName%" If Not Exist "%APPDATA%\%ProgrammName%" (
:: Тут копируем файлы в %ProgramFiles%
)
If Not Exist "%ProgramFiles%\%ProgrammName%" If Exist "%APPDATA%\%ProgrammName%" (
:: Тут копируем файлы в %APPDATA%
)
If Exist "%ProgramFiles%\%ProgrammName%" If Exist "%APPDATA%\%ProgrammName%" (
Echo:Wscript.Echo CreateObject^("Scripting.FileSystemObject"^).GetFileVersion^(WScript.Arguments^(0^)^)>"%~n0_filever.vbs"
For /F "Tokens=*" %%A In ('cscript //nologo "%~n0_filever.vbs" "%ProgramFiles%\%ProgrammName%"') Do (
For /F "Tokens=*" %%B In ('cscript //nologo "%~n0_filever.vbs" "%APPDATA%\%ProgrammName%"') Do (
:: Версия файла в %ProgramFiles% новее
If "%%A" GTR "%%B" (
:: Копируем в %ProgramFiles%
Call XCopy /FYERH * "%ProgramFiles%\%%ProgrammName:%ProgrammName:*\=%=%%"&&Call Del /F /Q "%ProgramFiles%\%%ProgrammName:%ProgrammName:*\=%=%%%~0"
)
:: Версия файла в %APPDATA% новее
If "%%B" GTR "%%A" (
:: Копируем в %APPDATA%
Call XCopy /FYERH * "%APPDATA%\%%ProgrammName:%ProgrammName:*\=%=%%"&&Call Del /F /Q "%APPDATA%\%%ProgrammName:%ProgrammName:*\=%=%%%~0"
)
)
)
Del /F /Q "%~n0_filever.vbs" 2>nul
)
?
|
El Sanchez |
09-09-2012 20:43 1985711 |
Цитата:
Цитата i-Lex
тоесть я правильно понял, что всё это будет выглядеть вот так »
|
i-Lex, да, только добавьте аналогично к комментариям выше:
Код:
@Echo Off
SetLocal
Set ProgrammName=Lcx\lcx.exe
If Not Exist "%ProgramFiles%\%ProgrammName%" If Not Exist "%APPDATA%\%ProgrammName%" Exit /B 1
If Exist "%ProgramFiles%\%ProgrammName%" If Not Exist "%APPDATA%\%ProgrammName%" (
:: Тут копируем файлы в %ProgramFiles%
Call XCopy /FYERH * "%ProgramFiles%\%%ProgrammName:%ProgrammName:*\=%=%%"&&Call Del /F /Q "%ProgramFiles%\%%ProgrammName:%ProgrammName:*\=%=%%%~0"
)
If Not Exist "%ProgramFiles%\%ProgrammName%" If Exist "%APPDATA%\%ProgrammName%" (
:: Тут копируем файлы в %APPDATA%
Call XCopy /FYERH * "%APPDATA%\%%ProgrammName:%ProgrammName:*\=%=%%"&&Call Del /F /Q "%APPDATA%\%%ProgrammName:%ProgrammName:*\=%=%%%~0"
)
If Exist "%ProgramFiles%\%ProgrammName%" If Exist "%APPDATA%\%ProgrammName%" (
Echo:Wscript.Echo CreateObject^("Scripting.FileSystemObject"^).GetFileVersion^(WScript.Arguments^(0^)^)>"%~n0_filever.vbs"
For /F "Tokens=*" %%A In ('cscript //nologo "%~n0_filever.vbs" "%ProgramFiles%\%ProgrammName%"') Do (
For /F "Tokens=*" %%B In ('cscript //nologo "%~n0_filever.vbs" "%APPDATA%\%ProgrammName%"') Do (
:: Версия файла в %ProgramFiles% новее
If "%%A" GTR "%%B" (
:: Копируем в %ProgramFiles%
Call XCopy /FYERH * "%ProgramFiles%\%%ProgrammName:%ProgrammName:*\=%=%%"&&Call Del /F /Q "%ProgramFiles%\%%ProgrammName:%ProgrammName:*\=%=%%%~0"
)
:: Версия файла в %APPDATA% новее
If "%%B" GTR "%%A" (
:: Копируем в %APPDATA%
Call XCopy /FYERH * "%APPDATA%\%%ProgrammName:%ProgrammName:*\=%=%%"&&Call Del /F /Q "%APPDATA%\%%ProgrammName:%ProgrammName:*\=%=%%%~0"
)
)
)
Del /F /Q "%~n0_filever.vbs" 2>nul
)
|
Нер аботает(Вот что выдаёт.
|
Ось ХРюша (если это важно)
|
i-Lex, Вы в какой кодировке сохранили пакетный файл?!
|
Iska, странно. Раньше в анси сохранял блокнотом - не пахало. Сохранил через Sublime Text - заработало.
Спасибо!
|
El Sanchez |
11-09-2012 23:20 1987046 |
Цитата:
Цитата i-Lex
Раньше в анси сохранял блокнотом - не пахало. Сохранил через Sublime Text - заработало. »
|
i-Lex, сохранять желательно в DOS-кодировке (OEM 866), если не хотите получить проблем еще из кириллицей. Блокнот ну никак не годится.
|
El Sanchez, да просто по привычке пользуюсь.
Мне Sublime Text нравится, но он сволоч в АНСИ не читает русский язык и выдаёт каракули(
|
Пытаюсь использовать в своей программе фрагменты представленного выше кода, где нужно получить версию заданного файла.
Код:
@echo off
SetLocal
set PATH=%~dp0
Echo:Wscript.Echo CreateObject^("Scripting.FileSystemObject"^).GetFileVersion^(WScript.Arguments^(0^)^)>"%PATH%_filever.vbs"
FOR /F "Tokens=*" %%A IN ('cscript //nologo "%PATH%_filever.vbs" "%PATH%TeamViewer_.exe"') DO (
...
В последней приведенной строке кода получаю:
"cscript" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Файл _filever.vbs создается и работает. Команда cscript /? так же работает. Скрипт сохранял как в ANSI 1251, так и в OEM 866.
Не пойму, чего не хватает?
|
tech-gs, Ваша существенная ошибка в том, что Вы подменяете в своём пакетном файле системную переменную окружения «PATH» на свою собственную. Отсюда и дальнейшие проблемы. Замените у себя везде «PATH», например, на «sPath».
|
Цитата:
Цитата Iska
Замените у себя везде «PATH», например, на «sPath». »
|
Заработало. Спасибо!
|
Время: 18:40.
© OSzone.net 2001-