Почему ExecShell игнорирует мои аргументы типа show?

Я пытаюсь выполнить пакетный файл без вывода сообщений и асинхронно из установщика NSIS. Я хочу, чтобы он был тихим, чтобы пользователь не мог его закрыть, и я хочу, чтобы он был асинхронным, чтобы программа установки закрывалась автоматически, пока пакетный файл все еще работает. Идея состоит в том, чтобы пакетный файл удалял установщик как способ реализации самоудаляющегося установщика. Но этот вопрос касается конкретно выполнения пакетного файла.

Я могу выполнить пакетный файл в автоматическом режиме, используя nsExec::Exec, и я могу выполнить пакетный файл асинхронно, используя Exec. Я пытаюсь сделать и то, и другое, используя ExecShell, но это не работает. Аргумент типа шоу, похоже, игнорируется независимо от того, что я ему передаю. Чтобы подтвердить, что это не ограничивается пакетными файлами и SW_HIDE, я попытался открыть простой текстовый файл в свернутом виде, но до сих пор не могу этого сделать.

ExecShell "" "path.txt" SW_SHOWMINIMIZED

ExecShell "open" "path.txt" SW_SHOWMINIMIZED

Оба этих варианта просто открывают WordPad (мой вариант по умолчанию) в обычном несвернутом окне. Я пытался запросить права администратора и скрыть детали установки, но ничего не работает. Что я могу сделать?


person Kyle Delaney    schedule 01.05.2018    source источник
comment
Смешивание .txt и WordPad в этом неудачно, потому что это зависит от регистрации оболочки, и WordPad также может игнорировать ваш запрос. Пожалуйста, опубликуйте простой пример пакетного файла (ping localhost или что-то еще) и то, как вы его выполняете. Пожалуйста, также сообщите нам свою версию Windows.   -  person Anders    schedule 01.05.2018
comment
Я использую Windows 10. И я думал, что текстовые файлы и WordPad были довольно стандартными, поэтому я понятия не имел, что они смогут повредить эту функциональность. Может ли регистрация оболочки также воспроизводиться в пакетных файлах? Будет ли это действительно зависеть от содержимого пакетного файла?   -  person Kyle Delaney    schedule 01.05.2018
comment
Регистрация оболочки также может испортить пакетные файлы, если вы просто предполагаете, что по умолчанию выполняется пакетный файл, а не его редактирование и т. д. Содержимое пакетного файла не имеет большого значения, но его удобно иметь, если другим людям нужно попытаться воспроизвести вашу проблему.   -  person Anders    schedule 02.05.2018


Ответы (1)


Синтаксис для ExecShell - verb command_line [parameters [showmode]], и вы не можете пропустить параметр параметров, даже если вы этого не хотите, если вы сделаете ExecShell "" "path.txt" SW_SHOWMINIMIZED, тогда SW_SHOWMINIMIZED будет параметром, заданным для "path.txt". Правильный синтаксис будет ExecShell "" "path.txt" "" SW_SHOWMINIMIZED.

Вы можете просто сделать ExecShell "open" "c:\path\batch.bat" "" SW_HIDE, но это может сломаться, если кто-то настроил пакетные файлы для открытия в своем текстовом редакторе по умолчанию. Лучше заставить интерпретатор:

InitPluginsDir
FileOpen $0 "$PluginsDir\batch.bat" w
FileWrite $0 "ping localhost$\r$\necho."
FileWriteByte $0 7 ; ASCII Bell so we know it is running even if hidden
FileWrite $0 "$\r$\n"
FileWrite $0 "ping localhost$\r$\n" ; Another ping so ASCII Bell actually makes a sound before the process quits
FileClose $0

ExpandEnvStrings $0 %COMSPEC%
StrCmp $0 "%COMSPEC%" 0 +2
StrCpy $0 "$SysDir\cmd.exe"
ExecShell "" '$0' '/C "$PluginsDir\batch.bat"' SW_HIDE
Abort "Done"
person Anders    schedule 01.05.2018
comment
Спасибо за ответ. Чтобы было ясно, важной частью вашего кода является передача cmd.exe в качестве команды ExecShell и командного файла в качестве параметра, верно? Действительно ли необходимо видеть, равен ли %COMSPEC% %COMSPEC%? - person Kyle Delaney; 02.05.2018
comment
Жаль, что руководство NSIS неверно истолковывает синтаксис ExecShell. - person Kyle Delaney; 02.05.2018
comment
Вы можете использовать "$SysDir\cmd.exe" напрямую, если вам не нужна comspec (win95/98/me). Документы не ошибаются, насколько я могу судить, но, возможно, они могли бы быть яснее. - person Anders; 02.05.2018
comment
В документации параметры и режим показа находятся на одном уровне, что делает их необязательными, а режим показа не зависит от параметров. nsis.sourceforge.net/Docs/Chapter4.html - person Kyle Delaney; 02.05.2018
comment
Боюсь, большая часть документации использует этот синтаксис. Я посмотрю, что я могу сделать, или, по крайней мере, добавлю пример. - person Anders; 02.05.2018