Показать полную графическую версию : [решено] Поиск файла в 2х дерикториях, сравнение версии и принятие решения
Нужен скрипт, который будет искать исполняемый файл программы в C:\Program Files\%ProgrammName%\ и в С:\Users\%UserName%\appdata\roaming\%ProgrammName%\ ,
Если находится только 1 исполняемый файл - копирует дополнительные файлы из директории, где находится скрипт в директорию программы. Если находятся оба - проверяет версию и копирует файлы в папку с более новой версией программы.
Такое возможно?
El Sanchez
07-09-2012, 11:02
Возможно. »
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
В части MyProgramName\program.exe мне нужно вписать папку с программой и название самого файла программы? »
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
тоесть я правильно понял, что всё это будет выглядеть вот так »
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
Раньше в анси сохранял блокнотом - не пахало. Сохранил через 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».
Замените у себя везде «PATH», например, на «sPath». »
Заработало. Спасибо!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.