Войти

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 9]


Страниц : 1 2 3 4 5 6 7 8 9 10 [11] 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

El Sanchez
12-01-2019, 10:13
так вот добавить? »
TROY Diamond, нет, после begin.
Соединить коды: 1-й со 2-м, сразу поле в первом коде вставить второй код? »
TROY Diamond, да. Вам бы справку почитать.
Как теперь подкорректировать размер свободного места на ЖД, который требует установщик? В нём ведь скомпилированы распакованные архивы и он считает их вес, а папки ведь поочередно удаляются после создания архивов, места нужно раза в 2 меньше, чем он хочет! »
TROY Diamond, забить на это.

TROY Diamond
19-01-2019, 17:14
El Sanchez, а если НЕ "забивать"? ))

2. Как сделать чтобы по умолчанию полученный установщик требовал для запуска права Администратора? "PrivilegesRequired=admin", - НЕ даёт нужного эффекта, "значка щита" у полученного setup.exe - нет!
Приходится потом редактировать Манифест в полученном файле setup.exe, с помощью редактора ресурсов! Менять на "requireAdministrator".

1specific
20-01-2019, 01:56
Всем привет.
Ищу человека который отлично ладит с inno setup.
Задача: сделать стучалку на сервер при установке программы, чтобы можно было подсчитать количество уникальных установок (подсчет уже на уровне сервера и к задаче не имеет отношения).
Разумеется "не за спасибо".
Скажите пожалуйста в какую тему мне обратиться с этой задачей? Если я по адресу - то пишите в ЛС. Договоримся!

Iska
20-01-2019, 02:56
1specific, «стучалка на сервер» делается в самом приложении, а не в инсталляции. И отрабатывать она должна в момент первого исполнения Вашего приложения. Так что, не страдайте ерундой.

habib2302
20-01-2019, 10:21
1specific, AutoIt в помощь

1specific
20-01-2019, 10:42
Iska, это вы так решили для своих нужд?
У меня цель - отстучать об успешной установке приложения. Не о запуске, а об установке.
В inno это реализуемо. Так к чему вообще ваше замечание не понимаю?

habib2302, как autoit связан например с post запросом на сервер после установки приложения? Я не понимаю как он применим к моей задаче.

habib2302
20-01-2019, 11:26
1specific, можно добавить проверку на удачную установку инсталлятора и задать запуск autoit скрипта после удачной установки

1specific
20-01-2019, 11:49
habib2302, ну гуд. Спасибо за идею.
Но в целом вопрос способа реализации не поднимался. Ищется человек который сможет реализовать мою задумку, а как это делать - это ему уже виднее) хоть отдельный софт, хоть vbs, хоть как)) мне главное результат)

Iska
20-01-2019, 12:17
Iska, это вы так решили для своих нужд? »
Неа.

У меня цель - отстучать об успешной установке приложения. Не о запуске, а об установке. »
А в чём смысл? Если Вас интересует накрутка («IE установлен на 100% компьютеров с ОС Microsoft Windows!») — делайте, как хотите Вы. Если Вас интересует реальное количество установок — делайте, как советую я. Единственное исключение — приложение не Ваше, доступа к его исходному коду у Вас нет, а Вы просто делаете какое-нибудь очередное поделие в стиле «репак bla-bla-bla». Тут уж выбора нет.

В inno это реализуемо. »
Угу. Тут больше зависит от того, как Вы будете сие реализовывать на стороне сервера. От этого и надо танцевать. Но в общем и целом сие может выглядеть, например, так: проверяете, есть ли соединение с глобальной сетью, создаёте экземпляр объекта «MSXML2.XMLHTTP» («Microsoft.XMLHTTP» и т.п., см., например: XMLHttpRequest — Википедия (https://ru.wikipedia.org/wiki/XMLHttpRequest)), заполняете его свойства, указываете метод (POST или GET), отсылаете методом .Send(), анализируете ответ, повторяете пару-тройку раз, если были некритичные ошибки. Коллеги нарисуют готовый код, я думаю. Если Вы со своей стороны опишите серверную часть.

Так к чему вообще ваше замечание не понимаю? »
Просто рекомендация. Разве я могу запретить Вам что-то делать?

habib2302, как autoit связан например с post запросом на сервер после установки приложения? Я не понимаю как он применим к моей задаче. »
Никак.

1specific
20-01-2019, 23:39
Iska, спасибо за ответ.

Если Вас интересует реальное количество установок — делайте, как советую я »
Да я бы с удовольствием сделал, если бы мои знания позволяли. Но мой пост о поиске исполнителя именно поэтому и появился - нужен человек который сможет реализовать.

Тут больше зависит от того, как Вы будете сие реализовывать на стороне сервера. От этого и надо танцевать »
На стороне сервера всё проще. Туда приходит post запрос с параметрами, мы эти параметры добавляем в БД. Вот у нас и собрана информация об установках в базе.

Но в общем и целом сие может выглядеть, например, так: проверяете, есть ли соединение с глобальной сетью, создаёте экземпляр объекта «MSXML2.XMLHTTP» («Microsoft.XMLHTTP» и т.п., см., например: XMLHttpRequest — Википедия), заполняете его свойства, указываете метод (POST или GET), отсылаете методом .Send(), анализируете ответ, повторяете пару-тройку раз, если были некритичные ошибки. »
Вообще для меня тёмный лес. Возможно это гениальная идея, но к сожалению я не в состоянии оценить)))

Коллеги нарисуют готовый код, я думаю. Если Вы со своей стороны опишите серверную часть. »
А вот тут легко:

После успешной установки, отсылаем post запрос вида site_ru/success.php?md5=11111&hwid=22222&os=7&ip=1.1.1.1.1
P.S. важно именно отослать post запрос незаметно для пользователя (т.е. не открыть страницу браузера после установки, а в фоне просто отослать). Причина - бональная защита от дураков которые путем изменения url могут накручивать установки.
Сервер принимает этот запрос, добавляет параметры запроса в базу (каждый в свою колонку таблицы).




md5 - это md5 установщика, который был успешно установлен (самого install.exe). Он будет всегда уникальный и генерируется на уровне сервера путем добавления байтов, перед тем как отдать его на скачивание.
hwd - это hwid железки на которой была произведена установка
os - это операционная система на которой была произведена установка
ip - это IP адрес устройства на котором была произведена установка (ну это возможно лишнее, т.к. ip мы можем определять при получении post запроса на сервере).

Iska
21-01-2019, 00:34
Вообще для меня тёмный лес. Возможно это гениальная идея, но к сожалению я не в состоянии оценить))) »
Ничего гениального в этом нет, обычная отсылка запроса, использующая готовую библиотеку посредством Automation. Примеры можно найти запросом по тем же ключевым словам, например:
Inno Setup "MSXML2.XMLHTTP"|"Microsoft.XMLHTTP" POST Send - Поиск в Google (https://www.google.com/search?q=Inno+Setup+%22MSXML2.XMLHTTP%22%7C%22Microsoft.XMLHTTP%22+POST+Send). Вот типичный образец (http://forum.oszone.net/post-1648368.html#post1648368) использования класса (причём, даже с разбором ответа сервера). Если вместо «Inno Setup» укажете «VBScript», или «VB», или «VBA» — найдёте уйму примеров, которые только и останется, что перевести с VBScript на Pascal.

Он будет всегда уникальный и генерируется на уровне сервера путем добавления байтов, перед тем как отдать его на скачивание. »
И этого бы я не советовал делать — на подобные вещи могут весьма нервно реагировать поведенческие анализаторы проактивной защиты антивирусов (вкупе с тем, что планируется, что инсталлятор будет «стучать» в сеть — чую, получится убойный эффект a-la красной тряпки для быка).

Я бы нацарапал, но думаю, у более опытных в Pascal коллег сие выйдет гораздо лучше.

ErikPshat
21-01-2019, 21:36
Можете подсказать, почему у меня ошибка could not call proc?

Пытаюсь при запуске инсталлятора проверить установленную версию PowerShell и если она меньше 5.1, тогда скачивать и устанавливать её.
Вот такой сокращённый код:

[Setup]
AppName=PowerShell
AppVersion=5.1

[Files]
Source: "embedded\ISSkin\ISSkinU.dll"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\ISSkin\Styles\{#Skin}.cjstyles"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\7z.dll"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\7z.exe"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\7z32.dll"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\7z32.exe"; DestDir: {tmp}; Flags: dontcopy

[Languages]
Name: "ru"; MessagesFile: "compiler:Languages\Russian.isl"

[CustomMessages]
ru.Caution7064=На компьютере обнаружена устаревшая версия PowerShell.%nПосле установки программы будет произведено скачивание и установка обновления PowerShell 5.1 для Windows 7 64bit.%n%nПожалуйста, дождитесь завершения обновления!

[_Code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:ISSkinU.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:ISSkinU.dll stdcall';
function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';

function IsWindowsVersionOrNewer(Major, Minor: Integer): Boolean;
var
Version: TWindowsVersion;
begin
GetWindowsVersionEx(Version);
Result := (Version.Major > Major) or ((Version.Major = Major) and (Version.Minor >= Minor));
end;

function IsWindows70OrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(6, 1); end;
function IsWindows80OrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(6, 2); end;
function IsWindows81OrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(6, 3); end;
function IsWindows10OrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(10,0); end;

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('{#Skin}.cjstyles');
LoadSkin(ExpandConstant('{tmp}\{#Skin}.cjstyles'), 'normalmystyle.ini');
Result := True;
end;

// Скачиваем PowerShell 5.1 под нашу версию Windows и битность...
procedure InitializeWizard;
var
PSVersion: String;
begin
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine','PowerShellVersion', PSVersion);
if ExpandConstant(Copy(PSVersion,1,3)) < ExpandConstant('5.1') then
begin
if IsWin64 then
begin
idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/Win7AndW2K8R2-KB3191566-x64.zip',ExpandConstant('{tmp}\Win7AndW2K8R2-KB3191566-x64.zip'),68076477); end else
if IsWindows80OrNewer and not IsWindows81OrNewer then begin MsgBox(ExpandConstant('{cm:Caution8064}'), mbInformation, MB_OK);
idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/W2K12-KB3191565-x64.msu',ExpandConstant('{tmp}\W2K12-KB3191565-x64.msu'),21585220); end else
if IsWindows81OrNewer and not IsWindows10OrNewer then begin MsgBox(ExpandConstant('{cm:Caution8164}'), mbInformation, MB_OK);
idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/Win8.1AndW2K12R2-KB3191564-x64.msu',ExpandConstant('{tmp}\Win8.1AndW2K12R2-KB3191564-x64.msu'),19878906); end;
idpDownloadAfter(wpReady);
end
else
begin
if IsWindows70OrNewer and not IsWindows80OrNewer then begin MsgBox(ExpandConstant('{cm:Caution7032}'), mbInformation, MB_OK);
idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/Win7-KB3191566-x86.zip',ExpandConstant('{tmp}\Win7-KB3191566-x86.zip'),44821734); end else
if IsWindows81OrNewer and not IsWindows10OrNewer then begin MsgBox(ExpandConstant('{cm:Caution8132}'), mbInformation, MB_OK);
idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/Win8.1-KB3191564-x86.msu',ExpandConstant('{tmp}\Win8.1-KB3191564-x86.msu'),15231117); end;
idpDownloadAfter(wpReady);
end;
end;
end;

// Во время показа страницы загрузки открываем по умолчанию скрытые детали загрузки...
procedure CurPageChanged(CurPageID: Integer);
begin
if not IsWindows10OrNewer then
begin
if CurPageID = IDPForm.Page.ID then
begin
// Показать детали загрузки
idpShowDetails(True);
// Скрываем кнопку Подробно/Скрыть
IDPForm.DetailsButton.Visible := False;
end;
end;
end;

// Распаковываем ранее скачанный ZIP/MSU и запускаем установку...
procedure CurStepChanged(CurStep: TSetupStep);
var
ResultCode: Integer;
begin
if CurStep = ssPostInstall then
begin
if IsWin64 then
begin
if FileExists(ExpandConstant('{tmp}\Win7AndW2K8R2-KB3191566-x64.zip')) then
begin
ExtractTemporaryFile('7z.exe');
ExtractTemporaryFile('7z.dll');
ShellExec('open',ExpandConstant('{tmp}\7z.exe'),ExpandConstant('x -y -oExtractedArchive ')+ExpandConstant('Win7AndW2K8R2-KB3191566-x64.zip'),'',SW_HIDE,ewWaitUntilTerminated,ResultCode);
ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\ExtractedArchive\Win7AndW2K8 R2-KB3191566-x64.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
end;
if FileExists(ExpandConstant('{tmp}\W2K12-KB3191565-x64.msu')) then ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\W2K12-KB3191565-x64.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
if FileExists(ExpandConstant('{tmp}\Win8.1AndW2K12R2-KB3191564-x64.msu')) then ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\Win8.1AndW2K12R2-KB3191564-x64.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
end
else
begin
if FileExists(ExpandConstant('{tmp}\Win7-KB3191566-x86.zip')) then
begin
ExtractTemporaryFile('7z32.exe');
ExtractTemporaryFile('7z32.dll');
ShellExec('open',ExpandConstant('{tmp}\7z32.exe'),ExpandConstant('x -y -oExtractedArchive ')+ExpandConstant('Win7-KB3191566-x86.zip'),'',SW_HIDE,ewWaitUntilTerminated,ResultCode);
ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\ExtractedArchive\Win7-KB3191566-x86.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
end;
if FileExists(ExpandConstant('{tmp}\Win8.1-KB3191564-x86.msu')) then ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\Win8.1-KB3191564-x86.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
end;
end;
end;

procedure DeinitializeSetup();
begin
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
UnloadSkin();
end;

Поясняю, ошибка возникает, когда я после скачивания PowerShell вставляю код открытия детализации "Показать" и скрытия кнопки "Скрыть" на странице скачивания.
Без этого кода всё работает нормально.
А при вставке кода, сразу ошибка, причём только при условия меньше или больше, а при равенстве условия сравнения версий, всё отрабатывает правильно.
Вот этот короткий код в скрипте:
// Во время показа страницы загрузки открываем по умолчанию скрытые детали загрузки...
procedure CurPageChanged(CurPageID: Integer);
begin
if not IsWindows10OrNewer then
begin
if CurPageID = IDPForm.Page.ID then
begin
// Показать детали загрузки
idpShowDetails(True);
// Скрываем кнопку Подробно/Скрыть
IDPForm.DetailsButton.Visible := False;
end;
end;
end;

ErikPshat
22-01-2019, 00:40
Эмм, попробую перефразировать по другому...
Я делаю установку программы, которая требует PowerShell последней версии 5.1 для Windows 7/8.0/8.1 (на 10-ке она стоит из коробки).
Так вот, я хочу в инсталляторе отобразить детализацию скачивания файла обновления и убрать там кнопку "Скрыть/Показать".
Но если я добавляю этот код, тогда программа вылетает с ошибкой "could not call proc".
Поэтому я прошу помощи - что я делаю не так?

Выше наверное никому не понятен мой сокращённый код.
Выкладываю готовый код, тоже сокращённый (выкинул все лишние файлы и строки программы), но код компилируемый и рабочий:

PowerShell.7z (https://www.mediafire.com/file/hyw9ezpatvav3r0/PowerShell.7z/file) (1.48 Мб)

В строке №76 выставлено условие сравнения < (меньше)
if ExpandConstant(Copy(PSVersion,1,3)) < ExpandConstant('5.1') then
Если у вас PowerShell устаревшая меньшей версии, тогда будет скачивание и установка.
А если у вас PowerShell уже обновлена, тогда вам нужно будет поменять на = (равно), иначе ничего происходить не будет.

Далее, нужно раскомментировать код отображения детализированных данных между строками 105 - 120:
procedure CurPageChanged(CurPageID: Integer);
begin
if not IsWindows10OrNewer then
begin
if CurPageID = IDPForm.Page.ID then
begin
// Показать детали загрузки
idpShowDetails(True);
// Скрываем кнопку Подробно/Скрыть
IDPForm.DetailsButton.Visible := False;
end;
end;
end;
И при условии < попробовать скомпилировать и найти ошибку, почему в этом случае выскакивает "could not call proc".
Что интересно, при условии = (равенства), никакой ошибки при компиляции не происходит.
Пожалуйста профи, не игнорируйте, помогите...

1specific
22-01-2019, 10:53
И этого бы я не советовал делать — на подобные вещи могут весьма нервно реагировать поведенческие анализаторы проактивной защиты антивирусов »
Согласен. Риск есть и риск высок. Но мне что-то не приходят другие варианты в голову, как за что еще можно зацепиться, чтобы был некий уникальный параметр установщика без его пересборки.
Исключение - изменение названия инсталлятора перед тем как отдать юзеру. Но высока вероятность что юзер его поменяет.

Я бы нацарапал, но думаю, у более опытных в Pascal коллег сие выйдет гораздо лучше. »
А более опытные коллеги видимо даже не обратят внимание на мой пост)) Таких как вы по пальцам одной руки пересчитать можно)
Так что буду рад сотрудничеству, если вы готовы.

El Sanchez
22-01-2019, 11:27
а если НЕ "забивать"? )) »
TROY Diamond, вы не знаете размер будущих архивов, поэтому DiskSpaceLabel-у вам нечего предложить.
Как сделать чтобы по умолчанию полученный установщик требовал для запуска права Администратора? "PrivilegesRequired=admin", - НЕ даёт нужного эффекта »
TROY Diamond, разработчик руководствуется тупыми гайдами от Microsoft по разработке десктопных приложений, хотя, возможно, баг, но баг слишком уж долгоживущий в официальной версии, чтобы быть багом. Китайская версия данного поведения не имеет.
за что еще можно зацепиться, чтобы был некий уникальный параметр установщика без его пересборки. »
1specific, например, GUID в конец инсталлятора. Но сначала четко определитесь с термином "успешная установка".
if ExpandConstant(Copy(PSVersion,1,3)) < ExpandConstant('5.1') then »
ErikPshat, во-первых, нельзя так версионные строки сравнивать. Когда-нибудь PSVersion станет 10.0 и это условие станет истинным. Во-вторых, ExpandConstant лишние, нет там брекетированных констант. В-третьих, ошибка у вас тогда, когда это выражение не истинно -> не выполняются idp-функции -> не создается IDPForm. И уже в CurPageChanged идет обращение к несуществующей IDPForm.

ErikPshat
22-01-2019, 15:39
El Sanchez, ну когда выйдет версия 10, тогда уже меня не будет ))) Да и даже когда она будет, то всё равно она менее сегодняшней 5.1 не станет по условию. Просто прога требует такую версию, но только в меньших версиях её код не срабатывает, поэтому для работы проги требуется не менее 5.1. Я рад, что хоть так работает )). Насчёт 2-го понял, приму к сведению.

В-третьих, ошибка у вас тогда, когда это выражение не истинно -> не выполняются idp-функции -> не создается IDPForm. И уже в CurPageChanged идет обращение к несуществующей IDPForm. »
Вот это мне и непонятно, что нужно сделать, чтобы заставить эту функцию отрабатывать именно после инициализации IDP.Form?
Я пихал её и в начало, и в середину, и в конец момента скачивания. Но всё равно одно и то же, либо ошибка, либо никакого эффекта не происходит. Трудно мне до этого догнать, я всего-то пару месяцев как начал осваивать Inno Setup.

El Sanchez
22-01-2019, 17:31
Я пихал её и в начало, и в середину, и в конец момента скачивания. Но всё равно одно и то же, либо ошибка, либо никакого эффекта не происходит. »
ErikPshat,

function StrCmpLogicalW(psz1, psz2: string): Integer; external 'StrCmpLogicalW@shlwapi.dll stdcall';

procedure InitializeWizard;
var
PSVersion: string;
begin
if not RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine', 'PowerShellVersion', PSVersion) or
(StrCmpLogicalW(PSVersion, '5.2') < 0) then
begin
{ ... }
{ IDPForm.Page is create inside idpDownloadAfter. }
idpDownloadAfter(wpReady);
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if not IsWindows10OrNewer and
Assigned(IDPForm.Page) then
begin
if CurPageID = IDPForm.Page.ID then
begin
{ ... }
end;
end;
end;

Iska
22-01-2019, 19:01
А более опытные коллеги видимо даже не обратят внимание на мой пост)) »
Обратят.

Таких как вы по пальцам одной руки пересчитать можно) »
Это далеко не так.

чтобы был некий уникальный параметр установщика »
Но зачем? Я бы просто генерировал тот же GUID на завершающем этапе установки — вот Вам и уникальность. А файл инсталляции должен быть одинаков для всех.

1specific
22-01-2019, 22:28
Но зачем? Я бы просто генерировал тот же GUID на завершающем этапе установки — вот Вам и уникальность. А файл инсталляции должен быть одинаков для всех. »

Потому что это делается для партнерской программы.
Чтобы считать количество уникальных скачиваний и знать от какого из партнеров был скачан и установлен файл делается связка md5+hwid
Где md5 привязывается к партнеру в БД и генерится на сервере путем добавления байтов, а hwid как показатель уникальности установки.
После чего данные проверяются, если установка уникальна (hwid,ip и т п), то партнеру засчитывается +1 установка (партнер определяется по md5).

Сгенерировать отдельный установщик под партнера (или как вы говорите GUID) возможно, если бы партнеров было 5-10 или 30. Но партнеров много, и неизвестно сколько. Под каждого генерить установщик это проблемно. Потом их все залить на хост - это уйма места. И далее если программа обновилась, это что каждому партнеру снова собирать и заливать установщик и закреплять руками md5 для каждого?
Поэтому было принято такое решение - исходный файл один, а далее под партнера при скачивании по его реф. ссылке генерится md5, который записывается в базу.

Надеюсь доступно описал весь процесс)

Обратят. »
Ну вот за неделю пока кроме вас даже никто и не ответил.

Это далеко не так. »
Наверняка много умных и опытных людей, но как я написал выше - судя по всему у них другие интересы.

ErikPshat
23-01-2019, 02:29
El Sanchez, о, спасибо большое! Как просто решаются сложные вопросы )) и как же сложно решить простые задачи ))

Я так понял, эта функция function StrCmpLogicalW - сравнение строк в Unicode-формате встроенными средствами Win API (String Compare Logical Wide).
И вы мне подкинули решение сравнения версий. Немного не ясна для меня прозрачность логики работы (я так понял 5.2 была выставлена для теста?):
if not RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine', 'PowerShellVersion', PSVersion) or
(StrCmpLogicalW(PSVersion, '5.1') < 0) then
Я пытаюсь прочитать это и как-то загадочно это. Предположим у пользователя (у меня) установлена последняя версия PowerShell 5.1, тогда читаю:

"Если не 5.1.14409.1005 (возвращает PSVersion из реестра) или 0.0.14409.1005 < 0 тогда... begin" и у меня пошла скачка и установка, даже если мне это не надо.

Первое условие из реестра получается никогда не выполняется, а служит только для доставания ключа из реестра в переменную PSVersion?
Вторым условием производится сравнение версии из реестра с требуемой нами. Но тогда и оно не отрабатывает, тем более, если оставить там 5.2.
Или я не правильно эту конструкцию читаю?

По-моему, моя прежняя конструкция вполне прозрачна (для меня) и отрабатывает правильно, даже если завтра выйдет версия 10.
Этот мой код с учётом вашей поправки насчёт лишнего ExpandConstant:
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine','PowerShellVersion', PSVersion);
if Copy(PSVersion,1,3) < '5.1' then
Тут просто первой строкой захватываем из реестра версию в переменную PSVersion и второй строкой производим сравнение. Через Copy отсекаем ненужные нам минорные цифры билда и оставляем для сравнения только первые 2 цифры (3 символа с точкой) и сравниваем с требуемой нам цифрой 5.1. Даже если выйдет версия 7.0 или 10.0 (навряд ли), тогда условие же всё равно будет выполняться, т.к. нам нужно чтобы версия PowerShell была не ниже 5.1, а то что старше и больше уже не важно.
На самом деле моей программе достаточно и PowerShell v5.0. Это прога по разбивке и упаковке папок на части по 4 Гб/2 Гб/Целиком, а так же, по загрузке файлов из интернета из XML со ссылками, контрольными суммами, и пр. тех. данными, и средствами PowerSell это удачно реализовалось.
Для справки (https://docs.microsoft.com/ru-ru/powershell/wmf/5.1/compatibility): на Win 7 из коробки установлена PS 2.0, на Win 8.0 стоит PS 3.0, на Win 8.1 - PS 4.0, на Win 10 - 5.0. Последняя стабильная 5.1. И больше на Windows 10 мало вероятно что предвидится.




© OSzone.net 2001-2012