Преобразовать существующий пакет в.exe, запущенный скрытым (без окна консоли)
Я ни в коем случае не программист, но мне по сути поручено именно это. Мне было поручено обновить сеть компьютеров с помощью нашей уже существующей установки дистрибутива, думаю, scccm, за исключением того, что я могу делать ТОЛЬКО файлы.exe / msi.
В любом случае, партия, которую я написал, работает фантастически; кроме того, что мне нужно, чтобы бежать тихо. По сути, вот задачи, которые он выполняет:
- Создает журнал на выделенном сетевом ресурсе с использованием% computername% и добавляет строку каждый раз, когда что-то происходит, и сообщает об успешном использовании, используя% errorlevel% с включенной отметкой времени и даты.
- Проверяет, запущена ли конкретная программа, если так, то она ждет 60 минут и пытается снова, если НЕТ, то проверяет версию, ранее установленную
- В зависимости от версии он будет использовать robocopy для замены устаревших файлов новыми.
- Затем устанавливает путь к имени TNS
- Конфигурирует только что установленную БД на основе имени компьютера
- Изменяет реестр
- Ставит иконку на рабочий стол
- сообщает о том, что все задачи выполнены в журнале должным образом и завершает работу.
Пакет извлекает все данные из общего сетевого ресурса и сохраняет журналы в тот же общий ресурс. Поскольку время, которое потребовалось мне для того, чтобы сделать это, я надеюсь, что смогу каким-то образом преобразовать его в.exe или.msi, и запустить без вывода сообщений. Я полагаю, что мог бы переписать это на языке, который мне незнаком, если бы мне пришлось.
Я попробовал несколько методов; iexpress, который прекрасно работает, но без тихой опции; Bat To EXE-конвертер, который работает, но отказывается компилировать, если я выбрал тихий; и, наконец, 7zip с использованием 7zS.sfx, но после компиляции он отказывается работать. Для всех exe-файлов, которые я искал, используя ресурсный хакер для настройки информации о программном обеспечении, пиктограмм, совместимости с Microsoft и т. Д. И т. Д. И т. Д. Я указал на установку INNO, но обнаружил, что она не может создавать флаги без вывода сообщений, и в большинстве статей просто говорится сделать и поставьте флаг, это плохое решение моей проблемы.
С чего мне начать?
1 ответ
Есть много простых способов запустить командный файл без окна консоли. Не нужно повторно реализовывать ваш командный файл.
Простой подход, который не требует какого-либо стороннего программного обеспечения, - это использование сценария VBScript или JScript, который запускает пакетный файл с использованием WScript.Shell.Run
метод с intWindowStyle
параметр установлен в 0 (= скрывает окно).
Цитируя ответ @Shaji на Как запустить пакетный файл без запуска "командного окна"?:
Сохраните следующее как wscript, например, hidecmd.vbs после замены "testing.bat" именем вашего пакетного файла.
Set oShell = CreateObject ("Wscript.Shell") Dim strArgs strArgs = "cmd /c testing.bat" oShell.Run strArgs, 0, false
Второй параметр
oShell.Run
являетсяintWindowStyle
значение, указывающее на внешний вид окна программы, а нулевое значение - для скрытого окна.Ссылка здесь https://msdn.microsoft.com/en-us/library/d5fk67ky.aspx
Для других методов, см.:
- Как запустить командный файл без запуска "командного окна"?
- Запустите командный файл полностью скрытым способом
Если вам действительно нужен.exe, вы можете использовать Inno Setup для его сборки. Просто запустите ваш пакетный файл в InitializeSetup
Функция события и прервать "установку" впоследствии. Результирующий .exe
не будет иметь графического интерфейса.
[Setup]
AppName=My Program
AppVersion=1.5
; Mandatory directive, but not actually used in this "installer"
DefaultDirName={pf}\My Program
#define SetupBatchFile "setup.bat"
[Files]
; Embed the batch file to the installer
Source: "{#SetupBatchFile}"; Flags: dontcopy
[Code]
function InitializeSetup(): Boolean;
var
BatchPath: string;
ResultCode: Integer;
begin
{ Extract the batch file }
ExtractTemporaryFile('{#SetupBatchFile}');
Log('Running batch file');
BatchPath := ExpandConstant('{tmp}\{#SetupBatchFile}');
if not Exec(BatchPath, '', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) then
begin
Log('Error running batch file');
end
else
begin
Log(Format('Batch file finished with exit code %d', [ResultCode]));
end;
Log('Exiting');
{ Prevents the actual Inno Setup installer from running }
Result := False;
end;
Если ваш пакетный файл не нуждается в правах администратора, добавьте эту директиву в [Setup]
раздел:
PrivilegesRequired=lowest