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

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

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

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

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

senderman

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


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

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

Всего записей: 560 | Зарегистр. 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, то окон консоли не будет видно.

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



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

Всего записей: 22061 | Зарегистр. 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-адреса?

Всего записей: 5462 | Зарегистр. 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

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



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

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

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

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

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

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

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

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



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

Всего записей: 5462 | Зарегистр. 23-06-2008 | Отправлено: 08:02 19-11-2020
gutasiho

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если рядом с батником (.cmd, .bat) положить файл .vbs
-----------
Set WshShell=CreateObject("WScript.Shell")
WshShell.Run "мой_батник.bat",0,false
Set WshShell=Nothing
WScript.Quit
-----------
и запустить его, то прописанный в нем батник запустится без мелькания консоли.

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



Gold Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
gutasiho
Цитата:
Если рядом с батником (.cmd, .bat) положить файл .vbs
В каком смысле "положить", записать на диск? Тогда зачем, его код в батнике? В VBS скриптах и батниках не разбираюсь...
 
Добавлено:
Так нельзя?
Код:
Set WshShell=CreateObject("WScript.Shell")
WshShell.Run "СтрокаЗапуска",0,false
Set WshShell=Nothing
WScript.Quit
"СтрокаЗапуска" формируется другим скрином!?
 
Добавлено:
И где строка разбора (ответ команды ping), по которой определю IP-адрес?

Всего записей: 5462 | Зарегистр. 23-06-2008 | Отправлено: 08:57 19-11-2020 | Исправлено: M_Volkov, 11:16 19-11-2020
RdMax

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

Цитата:
Как сделать отключение окна консоли и сохранить полную функциональность исполняемого скрипта?

Скрываю с помощью программы автоматизации [xStarter], пишу "алгоритм" и компилирую в готовый [*.exe] файл работающий без запуска [xStarter].

Всего записей: 64 | Зарегистр. 11-11-2020 | Отправлено: 10:39 19-11-2020
M_Volkov



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

Цитата:
Пытаюсь начать разобраться с VBS и BAT-скриптами.
Написал такой VBS-скрипт:
Код:
    СтрокаКоманды = "ping.exe -n 1 " + ИмяКомпьютера;
    Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
    Скрипт.Language = "VBscript";
    ТекстСкрипта = "
    |Function Ping()
    |set WshShell = CreateObject(""WScript.Shell"")
    |WshShell.Run (""" + СтрокаКоманды + """, 0, true)
    |End Function";
    Скрипт.AddCode(ТекстСкрипта);
    СтрокаОтвета = Скрипт.Run("Ping");
Сейчас ТекстСкрипта (см. отладчиком):
Цитата:
"
Function Ping()
set WshShell=WScript.CreateObject("WScript.Shell")
WshShell.Run "ping.exe -n 1 PERSEUS", 0, true
End Function"
Вроде правильно (или нет?), но СтрокаОтвета пустая. Почему, как поправить?
 
Добавлено:
Или Run не даст СтрокаОтвета, только Exec.StdOut.ReadAll()? При этом начнется мигание черного окна консоли!?
 
Добавлено:
Остается только в СтрокаКоманды формировать батник (cmd-файл) (писать его на диск обязательно, или достаточно его текста?), а затем скриптом запускать его, и получать его ответ СтрокаОтвета. Так?
Тогда как все это написать в VBS-скрипт(ы)?
 
Добавлено:
Нашел статью: Скрыть окно строки при использовании Exec () - это возможно или только предположение? - не мой уровень, не дорос еще...
 
Добавлено:
Но без вызова окна консоли не всегда удается!? Как мне объяснили на мисте (тоже 1С-ник): особенность команды Ping в том, что она ответ дает в окно консоли. Из этой строка выделяем IP-адрес. Поэтому, если нужно выделить IP-адрес, то без окна консоли не обойтись.

Всего записей: 5462 | Зарегистр. 23-06-2008 | Отправлено: 09:28 20-11-2020 | Исправлено: M_Volkov, 06:58 21-11-2020
teleportex

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

Цитата:
Еще можно скомпилировать вот этим

UAC не обходит, окно cmd всплывает.
что толку от этого ?

Всего записей: 472 | Зарегистр. 13-02-2013 | Отправлено: 14:42 30-11-2020
shadow_member



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
teleportex
Я определился, что лучший способ обойти UAC, это использовать Hidden Start. При этом получаем все ништяки - консоль не мелькает, UAC не всплывает, батник запускается от админа.

Всего записей: 22061 | Зарегистр. 18-07-2006 | Отправлено: 15:56 30-11-2020
teleportex

Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
если батник запускается из ярлыка, то можно полностью скрыть окно консоли через утилиту PowerRun
заодно можно выполнять батник с правами system или trustedinstaller.
пример -  

Код:
C:\Def\PowerRun.exe /SW:0 C:\Def\Def.bat

ключ /SW:0 - полное скрытие окна.

Всего записей: 472 | Зарегистр. 13-02-2013 | Отправлено: 16:16 30-11-2020 | Исправлено: teleportex, 17:08 30-09-2021
ripton07

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

Цитата:
если батник запускается из ярлыка, то можно полностью скрыть окно консоли через утилиту PowerRun
заодно можно выполнять батник с правами system или trustedinstaller.

Утилита отличная, но она работает только на повышение привилегий, от обычного юзера не получится, ....если задача стоит просто скрытие окна батника то лучше этого, мне кажется нет http://forum.oszone.net/showthread.php?t=29630

Всего записей: 28 | Зарегистр. 08-11-2013 | Отправлено: 05:48 19-11-2021
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

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


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

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2020

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru