Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Поиск файла в 2х дерикториях, сравнение версии и принятие решения (http://forum.oszone.net/showthread.php?t=242164)

i-Lex 06-09-2012 21:27 1984415

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

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

Iska 07-09-2012 08:10 1984561

Возможно.

El Sanchez 07-09-2012 11:02 1984633

Цитата:

Цитата Iska
Возможно. »

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 1985494

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"


i-Lex 09-09-2012 19:58 1985692

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 10-09-2012 17:45 1986226

Нер аботает(Вот что выдаёт.

i-Lex 10-09-2012 17:46 1986227

Ось ХРюша (если это важно)

Iska 11-09-2012 01:27 1986442

i-Lex, Вы в какой кодировке сохранили пакетный файл?!

i-Lex 11-09-2012 19:46 1986870

Iska, странно. Раньше в анси сохранял блокнотом - не пахало. Сохранил через Sublime Text - заработало.
Спасибо!

El Sanchez 11-09-2012 23:20 1987046

Цитата:

Цитата i-Lex
Раньше в анси сохранял блокнотом - не пахало. Сохранил через Sublime Text - заработало. »

i-Lex, сохранять желательно в DOS-кодировке (OEM 866), если не хотите получить проблем еще из кириллицей. Блокнот ну никак не годится.

i-Lex 12-09-2012 12:29 1987290

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

tech-gs 08-12-2012 17:59 2041361

Пытаюсь использовать в своей программе фрагменты представленного выше кода, где нужно получить версию заданного файла.

Код:

@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 2041384

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

tech-gs 09-12-2012 17:02 2041852

Цитата:

Цитата Iska
Замените у себя везде «PATH», например, на «sPath». »

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


Время: 18:40.

Время: 18:40.
© OSzone.net 2001-