PDA

Показать полную графическую версию : [решено] Поиск файла в 2х дерикториях, сравнение версии и принятие решения


i-Lex
06-09-2012, 21:27
Нужен скрипт, который будет искать исполняемый файл программы в C:\Program Files\%ProgrammName%\ и в С:\Users\%UserName%\appdata\roaming\%ProgrammName%\ ,
Если находится только 1 исполняемый файл - копирует дополнительные файлы из директории, где находится скрипт в директорию программы. Если находятся оба - проверяет версию и копирует файлы в папку с более новой версией программы.

Такое возможно?

Iska
07-09-2012, 08:10
Возможно.

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
)

i-Lex
09-09-2012, 12:48
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"

i-Lex
09-09-2012, 19:58
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
10-09-2012, 17:45
Нер аботает(Вот что выдаёт.

i-Lex
10-09-2012, 17:46
Ось ХРюша (если это важно)

Iska
11-09-2012, 01:27
i-Lex, Вы в какой кодировке сохранили пакетный файл?!

i-Lex
11-09-2012, 19:46
Iska, странно. Раньше в анси сохранял блокнотом - не пахало. Сохранил через Sublime Text - заработало.
Спасибо!

El Sanchez
11-09-2012, 23:20
Раньше в анси сохранял блокнотом - не пахало. Сохранил через Sublime Text - заработало. »
i-Lex, сохранять желательно в DOS-кодировке (OEM 866), если не хотите получить проблем еще из кириллицей. Блокнот ну никак не годится.

i-Lex
12-09-2012, 12:29
El Sanchez, да просто по привычке пользуюсь.
Мне Sublime Text нравится, но он сволоч в АНСИ не читает русский язык и выдаёт каракули(

tech-gs
08-12-2012, 17:59
Пытаюсь использовать в своей программе фрагменты представленного выше кода, где нужно получить версию заданного файла.


@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.
Не пойму, чего не хватает?

Iska
08-12-2012, 18:54
tech-gs, Ваша существенная ошибка в том, что Вы подменяете в своём пакетном файле системную переменную окружения «PATH» на свою собственную. Отсюда и дальнейшие проблемы. Замените у себя везде «PATH», например, на «sPath».

tech-gs
09-12-2012, 17:02
Замените у себя везде «PATH», например, на «sPath». »

Заработало. Спасибо!




© OSzone.net 2001-2012