Почему ExecShell игнорирует мои аргументы типа показа? - PullRequest
0 голосов
/ 01 мая 2018

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

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

ExecShell "" "path.txt" SW_SHOWMINIMIZED

ExecShell "open" "path.txt" SW_SHOWMINIMIZED

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

1 Ответ

0 голосов
/ 01 мая 2018

Синтаксис для 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"
...