Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Выполнение BAT-скриптов без вызова окна консоли

Модерирует : gyra, Maz

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3

Открыть новую тему     Написать ответ в эту тему

senderman

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Выполнение BAT-скриптов без вызова окна консоли


 
Те, кто использует BAT-скрипты рано или поздно сталкиваются с потребностью спрятать окно консоли при их исполнении. Это происходит тогда, когда в выводимой в это окно информации нет потребности и оно только загромождает экран. Как сделать отключение окна консоли и сохранить полную функциональность исполняемого скрипта?

Всего записей: 1488 | Зарегистр. 16-03-2019 | Отправлено: 11:44 02-09-2019 | Исправлено: senderman, 13:03 15-03-2020
iglezz

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
senderman
А разве Bat To Exe Converter не
Цитата:
может содержать код исполняющий и другие недокументированные задачи
???
 
В копилку к предложенным решениям - вариант с использованием nsis (исходник и готовый exe).

Всего записей: 1521 | Зарегистр. 18-02-2003 | Отправлено: 16:19 07-09-2019 | Исправлено: iglezz, 02:54 10-09-2019
VVL99

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А если в свойствах ярлыка поставить в свёрнутом виде?

Всего записей: 4158 | Зарегистр. 03-02-2011 | Отправлено: 16:53 07-09-2019
LonerD



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ConX
https://usbtor.ru/viewtopic.php?t=1368

Всего записей: 838 | Зарегистр. 27-06-2006 | Отправлено: 18:38 07-09-2019
senderman

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Выяснил:
 
"Bat To Exe Converter" начинает корректно работать со скриптами, определяющими свое местоположение, с весии 2.1.5
 
"Advanced Bat To Exe Converter" никакую версию корректно работать заставить не получилось.
 
Krot66
 
Вариант с конвертером "Bat To Exe Converter v2.1.5 - v3.2" работает не хуже варианта с "proxy.exe" и может применяться со сложными скриптами. Не путать с "Advanced Bat To Exe Converter" !
 
 
Добавлено:
iglezz
 
Естественно, может. Любая программа может грешить побочными возможностями. Вариант с открытым кодом надежнее. Но большинство программ открытого кода не имеют.
Опишите подробнее методику использования варианта с использованием nsis или дайте ссылку на описание.

Всего записей: 1488 | Зарегистр. 16-03-2019 | Отправлено: 18:53 07-09-2019 | Исправлено: senderman, 11:17 09-09-2019
senderman

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
VVL99

Цитата:
А если в свойствах ярлыка поставить в свёрнутом виде?

Этот способ и использование CMDOW и его аналога ConX - это полумеры. Окно консоли при этом выводится полнофункциональным и только после вывода сворачивается или гасится. То есть, пусть и непродолжительно, окно возникает на экране. Этого эффекта при использовании "proxy.exe" или "Bat To Exe Converter" нет. Окно консоли не возникает вовсе.

Всего записей: 1488 | Зарегистр. 16-03-2019 | Отправлено: 11:33 08-09-2019 | Исправлено: senderman, 11:34 08-09-2019
senderman

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Особого внимания заслуживает оригинальное решение, выполненное на базе установщика программ NSIS, предложенное iglezz. Оно использует способность установщика программироваться и запускать исполняемые файлы. Установщик в директории, где исполняется сам, ищет по имени, присвоенному ему, файл с расширением BAT или CMD и исполняет его. Собственные окна установщика и окно консоли при этом не появляются. При наличии командной строки она передается исполняемому файлу. Так как установщик NSIS компактный, конкретная реализация скрытия окна консоли также получилась достаточно компактной.

Всего записей: 1488 | Зарегистр. 16-03-2019 | Отправлено: 00:52 14-09-2019 | Исправлено: senderman, 12:44 15-03-2020
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть такой, где первым аргументом исполняемый файл, а вторым аргумент: RunHide.vbs
Но запуск PowerShell с аргументами не срабатывает, поэтому есть вариант, который, для каждого сценария надо свой: RunHidePowerSheellScript.vbs
Он принимает один аргумент, который будет подставлен в конец цепочки, на место file: prog & args & file
 
Есть и на C# StartHidden.cs

Всего записей: 3519 | Зарегистр. 16-08-2012 | Отправлено: 23:21 21-09-2019
VV2006

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Этот файл конвертер создает по ошибочной технологии и поэтому первый же пробел в адресе приводит к ошибке исполнения скрипта

senderman, а путь, содержащий пробелы, заключался в кавычки?  

Всего записей: 2123 | Зарегистр. 10-02-2006 | Отправлено: 11:30 22-09-2019
senderman

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
VV2006
 
Речь идет о программе "Advanced Bat To Exe Converter". Упомянутый путь не обрабатывается пользователем (путь к распакованному исполняемому файлу). Процесс обработки происходит автоматически. Я анализировал причину ошибки и пришел к выводу, который изложен в опубликованном выше посте:
 
http://forum.ru-board.com/topic.cgi?forum=5&topic=50322#12

Всего записей: 1488 | Зарегистр. 16-03-2019 | Отправлено: 21:07 22-09-2019 | Исправлено: senderman, 21:25 22-09-2019
obitt



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Те, кто использует BAT-скрипты рано или поздно сталкиваются с потребностью спрятать окно консоли при их исполнении.

http://www.oszone.net/6156

Всего записей: 578 | Зарегистр. 12-11-2006 | Отправлено: 23:49 08-11-2019
senderman

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Еще одна реализация скрытия окна консоли с открытым кодом
 
hidcon.cpp

Код:
// hidcon.cpp : Defines the entry point for the application.
//
 
#include "stdafx.h"
 
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    int bWait = 0;
 
    /* Получение адреса запущенной программы hidxxx.exe. */
    TCHAR szFileName[_MAX_PATH] = {0};
    TCHAR REVszFileName[_MAX_PATH] = {0};
    GetModuleFileName(0, szFileName, sizeof(szFileName));
 
    /* Выделение пути к запущенной програме. */
    int i = sizeof(szFileName) - 1;
    while (szFileName[i--] != atoi("92"));
    strncpy(REVszFileName, szFileName, i + 2);
 
    /* Формирование имени командного файла. */
    LPTSTR lpFNLine = szFileName;
    lpFNLine += (i + 2);
    i = 0;
    while (lpFNLine[i++] != '\0');
    lpFNLine[i - 5] = '.';
    lpFNLine[i - 4] = 'c';
    lpFNLine[i - 3] = 'm';    
    lpFNLine[i - 2] = 'd';
    lpFNLine[i - 1] = '\0';
    
    /* Если командная строка не пустая, исполнять её содержимое,
    иначе, содержимое строки lpFNLine. */
    if (lpCmdLine[0])
    {
        lpFNLine = lpCmdLine;
 
        /* По ключу командной строки "W,w" активизировать флаг ожидания завершения процесса. */
        if ((lpFNLine[0] == '/')&&((lpFNLine[1] == 'w')||(lpFNLine[1] == 'W'))&&(lpFNLine[2] == 0x20))
        {
        bWait = 1; lpFNLine += 3;
        }
    }
 
    /* Проверка имени командного файла. */
    i = 0;
    LPTSTR lpFNLineS = lpFNLine;
    while (lpFNLineS[i++] != '\0');
    lpFNLineS += (i -5);
    if  (!(lpFNLineS[0] == '.' && (lpFNLineS[1] == 'c' || lpFNLineS[1] == 'C') && (lpFNLineS[2] == 'm' || lpFNLineS[2] == 'M') && (lpFNLineS[3] == 'd' || lpFNLineS[3] == 'D')))
    {
        MessageBox(NULL, lpFNLine, "Не верное имя файла CMD:", MB_OK);
 
        return 0;
    }
    /* Если исполняемый файл не найден в текущем каталоге,
    использовать адрес запущенной программы hidxxx.exe. */
    LPCTSTR lpCurrentDirectory = NULL;
    WIN32_FIND_DATA fd;
    HANDLE fh = FindFirstFile(lpFNLine, &fd);
    if (fh == INVALID_HANDLE_VALUE)
    {
        lpCurrentDirectory = REVszFileName;
    }
 
    /* Создайть процесс с новой консолью. */
    memset(&si, 0, sizeof(si));
    si.cb = sizeof(si);
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;
    ZeroMemory(&pi, sizeof(pi));
 
    if(!CreateProcess(NULL, lpFNLine,
                      NULL, NULL, FALSE, CREATE_NEW_CONSOLE,
                      NULL, lpCurrentDirectory, &si, &pi))
    {
        MessageBox(NULL, lpFNLine, "Не удалось создать процесс:", MB_OK);
 
        return 0;
    }
        if(bWait) WaitForSingleObject(pi.hProcess, INFINITE);
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
 
    return 0;
}

 
stdafx.h

Код:
// stdafx.h : include file for standard system include files,
//  or project specific include files that are used frequently, but
//      are changed infrequently
//
 
#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_
 
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
 
#define WIN32_LEAN_AND_MEAN        // Exclude rarely-used stuff from Windows headers
 
 
// Windows Header Files:
#include <windows.h>
 
// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
 
// Local Header Files
 
// TODO: reference additional headers your program requires here
 
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
 
#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)

Компилировать можно как в VC, так и сторонними компиляторами.
 
Программа в директории, где исполняется сама или текущей директории, ищет по имени, присвоенному ей, файл с расширением CMD и исполняет его. Окно консоли при этом не появляется. Можно активизировать флаг ожидания завершения процесса. При наличии командной строки она передается исполняемому файлу. Эта реализация скрытия окна консоли получилась достаточно компактной.  
Почти все аналоги этой программы с закрытым кодом, что потенциально опасно (некоторые самопроизвольно обращаются к внешним адресам)  -  это достаточно веская причина для использования программ с открытым кодом.

Всего записей: 1488 | Зарегистр. 16-03-2019 | Отправлено: 10:16 03-03-2020 | Исправлено: senderman, 22:06 15-03-2020
eddiezato



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Использую пару-тройку powershell-скриптов для выполнения тех или иных задач по расписанию. Стартуют из системного Task Scheduler. Если настроить, чтобы задачи запускались от пользователя System, то окон консоли не будет видно.

Всего записей: 1644 | Зарегистр. 26-02-2011 | Отправлено: 10:56 03-03-2020
shadow_member



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
eddiezato
Цитата:
Если настроить, чтобы задачи запускались от пользователя System
Как это? Что-то не могу разобраться.

Всего записей: 22354 | Зарегистр. 18-07-2006 | Отправлено: 09:55 06-03-2020
senderman

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Программа скрытия окна консоли написанная на VB
 
hidcmd.bas

Код:
 ' hidcmd.bas
 
Attribute VB_Name = "Module1"
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwAccess As Long, ByVal fInherit As Integer, ByVal hObject As Long) As Long
 
Private Const INFINITE = &HFFFF
 
Public Sub WaitForProcessToEnd(cmdLine As String, windowstyle As VbAppWinStyle, Optional msWait As Long = INFINITE)
    ' Запускает процесс через Shell и ждет его завершения.
    ' [cmdLine]     - коммандная строка, может включать имя файла, параметры, ключи.
    ' [windowstyle] - стиль запускаемого окна: свернутое, развернутое и т.д.
    ' [msWait]      - макс. время ожидания.
    ' Вместо конст. INFINITE можно указать время в мсек.
    Dim retVal As Long, pID As Long, pHandle As Long
    pID = Shell(cmdLine, windowstyle)
    pHandle = OpenProcess(&H100000, True, pID)
    retVal = WaitForSingleObject(pHandle, msWait)
End Sub
 
Sub Main()
    ' Начальные установки и инициализация.
    Dim APth$, IsName$, CmdFile$, Say$
    Dim ArgArray() As String
    w$ = False
    ' Запуск приложения:
    ' hidcmd.EXE [CmdFile].
    ' =====================
    ' Открытие CMD-файла приложения
    CmdFile$ = Command$ ' чтение командной строки.
    If CmdFile$ = "" Then
    ' Если параметр не задан в командной строке,
    ' поумолчанию устанавливается имя самой утилиты с расширением CMD.
    CmdFile$ = App.EXEName + ".cmd"
    GoTo ww
    Else
    ' Выделение первого члена командной строки.
        If Mid$(CmdFile$, 1, 1) = Chr$(34) And Len(CmdFile$) > 1 Then
        ArgArray = Split(CmdFile$, Chr$(34))
        CmdFile$ = ArgArray(1)
        Else
        ArgArray = Split(CmdFile$, " ")
        CmdFile$ = ArgArray(0)
        End If
    End If
    ' Проверка расширения файла.
    Select Case Right$(LCase$(CmdFile$), 4)
        Case ".cmd"
        Case ".bat"
    Case Else
        Say$ = "CMD-файл = " & CmdFile$
        MsgBox Say$, , "Синтаксическая шибка в командной строке:"
    Exit Sub
    End Select
    ' Восстановление оригинала командной строки.
    CmdFile$ = Command$
ww:
    ' Проверка наличия CMD-файла, указанного в командной строке.
    If Dir(CmdFile$) <> "" Then
    ' Открытие наличного CMD-файла, чтение и исполнение содержимого.
    Else
        If w$ = False Then
        w$ = True
        APth$ = App.Path ' Полный путь к стартовому каталогу.
        ChDrive (Mid(APth$, 1, 1)) ' Активизация стартового диска.
        ChDir (APth$) ' Активизация стартового каталога.
        GoTo ww
        Else
        Say$ = "CMD-файл = " & CmdFile$
        MsgBox Say$, , "Не удается найти:"
        End If
    Exit Sub
    End If
Call WaitForProcessToEnd(CmdFile$, vbHide)
End Sub

 
Project1.vbp

Код:
Type=Exe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\WINDOWS\system32\stdole2.tlb#OLE Automation
Module=Module1; hidcmd.bas
Startup="Sub Main"
Title="hidcmd"
ExeName32="hidcmd.exe"
Command32=""
Name="Project1"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionCompanyName=""
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
 
[MS Transaction Server]
AutoRefresh=1

 
Выполняет те же функции, что и программа hidcon.

Всего записей: 1488 | Зарегистр. 16-03-2019 | Отправлено: 22:01 15-03-2020 | Исправлено: senderman, 13:00 16-03-2020
M_Volkov



Gold Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Мне 1С-нику с появлением онлайн-кассы общего использования понадобилась такая функция для пингования компьютера с кассой. В условиях пандемии многие стали работать удаленно, их надо отличать от обычных (внутренних) пользователей, с какого компьютера он зашел в базу 1С, определяется тоже этой функцией. Работает много лет, но мелькание черного окна напрягает, захотелось его убрать. Мне объяснили
Цитата:
Можно убрать, если обернуть в VBS скрипт. То есть схема такая: через WScript.Shell запускаешь VBS скрипт, в нем запускаешь cmd и ставишь признак скрыть окно, в cmd запускаешь chcp + ping.
Вот так вот в винде все хитро устроено.
iNNOKENTIY21 прислал мне вариант через WMI. Но для меня это сложно: случись что - поправить не смогу. Пытаюсь начать разобраться с VBS и BAT-скриптов. Пробный написал (добавил команды, чтобы абракадабры не было, но она не мешает, фрагмент "ttl=" и IP-адрес в кв. скобках не портит), но он мигает черным окном. Не понял, VBS скриптом его не убрать для получения IP-адреса?

Всего записей: 5783 | Зарегистр. 23-06-2008 | Отправлено: 07:11 19-11-2020 | Исправлено: M_Volkov, 07:26 19-11-2020
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
M_Volkov

Цитата:
Вот так вот в винде все хитро устроено.

https://www.robvanderwoude.com/battech_hideconsole.php
можно и использовать конвертеры bat в exe
https://www.majorgeeks.com/files/details/bat_to_exe_converter.html

Всего записей: 15101 | Зарегистр. 20-09-2014 | Отправлено: 07:17 19-11-2020 | Исправлено: Mavrikii, 07:21 19-11-2020
M_Volkov



Gold Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Mavrikii
Т.е. VBS-скрипт сначала надо записать в файл, и запускать этот файл скрытым? Только так?

Всего записей: 5783 | Зарегистр. 23-06-2008 | Отправлено: 07:41 19-11-2020
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
M_Volkov

Цитата:
Т.е. VBS-скрипт сначала надо записать в файл, и запускать этот файл скрытым? Только так?

vbs позволит запустить скрытый bat и закончится.

Всего записей: 15101 | Зарегистр. 20-09-2014 | Отправлено: 07:48 19-11-2020
gutasiho

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
M_Volkov
Сначала для скрытого запуска батников долго использовали Hidden Start. Затем попробовал вариант через vbs, он работал, но в несколько раз медленнее, если с HS батник отрабатывает за пол-секунды, то с vbs за 4 секунды. К тому же, с HS обходится и запрос UAC, хотя батник от админа. В результате снова вернулись на HS, и рады, а выполнение vbs заблокировали в политиках ради безопасности.

Всего записей: 6349 | Зарегистр. 14-09-2020 | Отправлено: 08:01 19-11-2020
M_Volkov



Gold Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Mavrikii
В созданный и записанный bat-файл!? А не записанный на диск никак не запустить скрытым?

Всего записей: 5783 | Зарегистр. 23-06-2008 | Отправлено: 08:02 19-11-2020
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3

Компьютерный форум Ru.Board » Компьютеры » Программы » Выполнение BAT-скриптов без вызова окна консоли


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru