Как открыть консольное приложение с заданным размером окна?

16

Приложение, которое я хочу запустить, - MongoDB. Если бы я начал это нормально, это выглядит так:

введите описание изображения здесь

Мне не нравится количество разрывов строк, и у меня много места на экране, поэтому я хотел бы использовать это пространство, чтобы избавиться от разрывов строк.

Я могу изменить размер окна консоли MODE, поэтому я написал командный файл следующим образом:

@ECHO OFF
MODE con:cols=140 lines=70
%~dp0mongodb\bin\mongod --dbpath %~dp0data --rest

Все идет нормально. Когда я запускаю этот пакетный файл, я получаю большее окно, по желанию.

Но когда я теперь нажимаю Ctrl+ Cдля выхода из MongoDB, я получаю раздражающее приглашение:

Terminate batch job (Y/N)?

Что бесполезно, потому что команда, из которой я только что вышел, была последней командой в пакетном задании в любом случае, и независимо от того, что я отвечаю, результат один и тот же.

Итак, как я могу получить большее окно консоли для приложения, не имея этого запроса, когда я нажимаю Ctrl+ C?

Der Hochstapler
источник

Ответы:

12

Сегодня я потратил несколько часов на реализацию небольшого приложения на C #, которое может обернуть другое консольное приложение и настроить размер окна хоста консоли.

console-wrapperпрост в использовании. Он ожидает только пару параметров командной строки:

Usage: console-wrapper.exe [OPTIONS]

Options:

      --subject=VALUE        The application that should be started by the
                               console wrapper.
      --width=VALUE          The desired width of the console window.
      --height=VALUE         The desired height of the console window.
  -h, -?, --help             Shows this help message

--widthи --heightиспользуются для установки размера результирующего окна консоли. --subjectможет использоваться опционально, если он опущен, остальные параметры обрабатываются как команда (с параметрами) для запуска.

Итак, последний вызов, который я сейчас использую в нашем скрипте запуска:

START "MongoDB" database\console-wrapper.exe --width=140 --height=70 %~dp0database\mongodb\bin\mongod.exe --dbpath %~dp0database\data --rest

Результирующее окно будет иметь запрошенный размер, и после нажатия Ctrl+ Cокно закроется (после правильного завершения процесса).

Der Hochstapler
источник
6

Рассматривали ли вы запускать его из сценария PowerShell? Powershell способен изменять размеры своего окна

$h = Get-Host
$buf = $h.UI.RawUI.BufferSize
$buf.Width = 300
$h.ui.rawui.BufferSize = $buf
$win = $h.UI.RawUI.WindowSize
$win.Width = 150
$h.ui.rawui.WindowSize = $win
#Command to start mongodb here.

Это создает окно размером 150, но также имеет боковой прокручиваемый буфер 300.

Скотт Чемберлен
источник
Да, я обдумал это, но не знал, как это реализовать в то время. Это работает отлично, за исключением небольшого раздражения, что выполнение сценариев может быть возможно отключено.
Der Hochstapler
5

Насколько я понимаю вопрос, вы хотите, чтобы MongoDB имел заданный размер окна консоли и выходил при нажатии Ctrl+ C. Тогда ответ довольно прост: используйте ярлык, чтобы запустить его.

У меня нет mongodисполняемого файла, поэтому я хотел бы использовать perl.exeв качестве примера. Когда вы запускаете его из диалогового окна « Выполнить » ( Windows+ R), размер окна консоли будет стандартным 80 × 25 с размером буфера на 300 строк.

  1. Создайте ярлык для mongod(или perlв моем случае).
  2. Щелкните правой кнопкой мыши ярлык и выберите Свойства .
    1. На вкладке « Ярлык » в поле « Цель» добавьте параметры mongod.
    2. Start in field управляет начальным текущим каталогом запущенной программы. По умолчанию это каталог, в котором находится .exe.
  3. Нажмите вкладку Layout .
    1. Измените размер окна на 140 × 70.
      Свойства ярлыка, вкладка Layout
    2. Вы можете увеличить Высоту от экрана размера буфера 1000 или больше , чтобы иметь возможность прокручивать до старых сообщений.
    3. Если вы очистите окно «Положение системы» , вы можете указать расположение окна консоли на экране.
  4. Нажмите OK, чтобы закрыть свойства ярлыка.

Теперь, когда вы нажмете этот ярлык, окно консоли будет иметь указанный размер. Когда вы нажимаете Ctrl+ C, приложение закрывается, и окно закрывается без каких-либо дополнительных запросов.


Вы также можете изменить макет окна после его запуска из диалогового окна « Выполнить ». Щелкните правой кнопкой мыши заголовок окна консоли и выберите « Свойства» . Перейдите на вкладку « Макет », настройте размер окна и нажмите « ОК», чтобы закрыть свойства и немедленно применить изменения. (Если окно было запущено из ярлыка, свойства ярлыка обновляются.)

В следующий раз, когда вы запустите то же приложение, размер окна консоли будет волшебным образом того же размера. (На этот раз я не проверял, но это работало.)

Алексей Иванов
источник
Местоположение mongod.exeне является фиксированным. Это изменится в зависимости от развертывания приложения. Именно поэтому я стремился к решению через консоль напрямую. Когда я указываю относительный путь в полях назначения или рабочего каталога для ярлыка, он не принимает их :(
Der Hochstapler
@OliverSalzburg Вы пробовали подход перезапуска партии ? Я имею в виду, что ваш пакет запускается сам с помощью start cmd /kи передает дополнительный параметр или устанавливает переменную среды. Затем второй экземпляр изменяет размер окна консоли и запускается mongod.exe.
Алексей Иванов
Да, я много чего перепробовал. Но до тех пор, пока задействован пакетный файл, решение будет страдать от Terminate batch job (Y/N)?приглашения: \ Я на самом деле только что закончил реализацию приложения-оболочки, чтобы решить эту проблему для меня.
Der Hochstapler
@OliverSalzburg Это будет очень полезная утилита. Я также думал, что обертка будет единственным способом ...
Алексей Иванов
3

Настройки макета консоли по умолчанию находятся здесь в реестре:

[HKEY_CURRENT_USER\Console]

Вы можете изменить эти параметры, и они будут применяться ко ВСЕМ командным окнам, которые запускаются, независимо от пути. К сожалению, необработанные ценности не дружественны человеку.

Чтобы установить их так, как вы хотите, откройте обычное окно cmd, затем отредактируйте настройки по своему вкусу. Посмотрите в реестре по указанному выше пути, и вы должны увидеть вложенный ключ в разделе «Консоль» для cmd.exe. Экспортируйте этот ключ в файл, измените путь к указанному выше и импортируйте, или просто вручную скопируйте значения из одного в другое. Затем вы можете удалить запись cmd.exe. Теперь все открываемые командные окна будут использовать измененные значения по умолчанию.

Мне показалось удобным создать пару файлов записей реестра с моими стандартными настройками по умолчанию, чтобы я мог легко перенести их на новый сервер при первом включении RDP. Я сделал пресеты для двух размеров, которые я обычно использую.

Для 1024 x 768 (я использую это для серверов, к которым обычно обращаются через многосессионный инструмент RDP):

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Console]
"ScreenBufferSize"=dword:012c0050
"WindowSize"=dword:00190050
"WindowPosition"=dword:000a000a
"FontSize"=dword:000c0007
"FontFamily"=dword:00000030
"FontWeight"=dword:00000190
"FaceName"="Terminal"
"QuickEdit"=dword:00000001

Для 1280 x 1024:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Console]
"ScreenBufferSize"=dword:0bb800af
"WindowSize"=dword:004b00af
"WindowPosition"=dword:000a000a
"FontSize"=dword:000c0007
"FontFamily"=dword:00000030
"FontWeight"=dword:00000190
"FaceName"="Terminal"
"QuickEdit"=dword:00000001
Питер
источник
0

Поместите Startкоманду перед вызовом mongodb. Я считаю, что это должно исправить.

Keltari
источник
Нет, это открывает MongoDB в новом окне консоли. Когда я использую start /bего, окно консоли останется открытым после того, как я нажму Ctrl + C.
Der Hochstapler
0

Если вы готовы запустить пакетный файл вместе с несколькими крошечными вспомогательными программами, я разместил полное решение здесь:
Как пакетный файл может запустить программу и установить положение и размер окна?

Содержание как ниже. , , ,

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

Прочитайте все комментарии и описание в командном файле для получения дополнительной информации.

Используемые инструменты:
1.   MonitorInfoView  от Nir Sofer (41 КБ)
2.   NirCmd  от Nir Sofer (43 КБ)
3.   GetPIDs  от Daniel Scheibli (280 КБ)
4.   upx.exe  --- это программа командной строки, которую мы будем использовать для этой демонстрации; поместите его в тот же каталог, что и пакетный файл.
5. Пакетный файл - см. Ниже

Соберите все пять файлов в каталог. Это командный файл, готовый для запуска в любой системе Windows.

То, что собирается сделать этот демонстрационный пакет, помимо предоставления вам пользовательского окна консоли, это то, что он будет работать upx.exeс переключателями командной строки--best -v -o getpids-compressed.exe getpids.exe, Мы собираемся сжать наш инструмент «GetPID» до 88 КБ ........ После запуска дважды щелкните строку заголовка этого окна консоли, чтобы увидеть интересное явление; это окно консоли ведет себя как графический интерфейс!

@echo off
setlocal enabledelayedexpansion enableextensions
pushd %~dp0%

REM ----- ADD SOME USEFUL INFORMATION TO THIS CONSOLE WINDOW TITLE.
for /f "tokens=3" %%A in ('getpids.exe') do set _PROCESS_ID_=%%A
title This batch file runs a command-line program and sets the position and size of its console window        (PROCESS ID = %_PROCESS_ID_%)

REM ********************** DESCRIPTION ************************************
REM ** This script opens a command-line program console window with specified
REM ** screen properties at the primary monitor (containing the taskbar).
REM ** The "X/Y position" and "W/H size" of the console window is auto-set by
REM ** this script and the monitor resolution is auto-calculated to suit.
REM ** 'MonitorInfoView.exe' is the helper tool used to capture the resolution
REM ** info of the monitor.
REM ** 'nircmd.exe' is the tool performing all the display trickery.
REM ** 'getpids.exe' is the helper tool used to capture the Process ID of the
REM ** working batch file, thus allowing us to identify which CMD.EXE host this
REM ** console window belongs to when looking at Task Manager.
REM **
REM ** To tweak this script, go to the code section named:
REM ** >>>>> USER INPUT/PREFERENCES ARE ALL SET HERE <<<<<
REM ***********************************************************************

REM ----- CLEAR ANY PREVIOUS JOB OUTPUTS IF THEY EXIST
if exist ~TMP.TXT type NUL > ~TMP.TXT

REM ----- OUTPUT THE PRIMARY MONITOR INFORMATION TO A TEXT FILE
MonitorInfoView.exe /hideinactivemonitors 1 /stext ~TMP.TXT

REM ----- ISOLATE THE RESOLUTION LINE, REMOVING ALL THE OTHER LINES IN THE TEXT FILE
for /f "delims=" %%A in ('type "~TMP.TXT" ^|find.exe /i "Maximum Resolution"') do echo %%A>~TMP.TXT

REM ----- GET THE RESOLUTION NUMBERS, AND SET THEM AS VARIABLES
for /f "tokens=3,4 delims=:X " %%A in ('type "~TMP.TXT"') do set _SCREENW_=%%A& set _SCREENH_=%%B


REM >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
REM >>>>>>>>>> USER INPUT/PREFERENCES ARE ALL SET HERE [BEGIN] <<<<<<<<<<<<

REM ----- ----------------------------------------
REM ----- |COMMAND-LINE PROGRAM TO BE RUN:  FILE NAME (WITH EXTENSION)
REM ----- |
REM ----- | |IF PROG TO BE RUN IS 'CMD.EXE' (WINDOWS COMMAND PROCESSOR)
REM ----- | |ALSO READ THE NEXT COMMENTS ABOUT SETTING SWITCHES   

    set _MYPROGRAM_=upx.exe

REM ----- ----------------------------------------   
REM ----- |COMMAND-LINE PROGRAM TO BE RUN:  SWITCHES (TO BE PASSED TO THE PROGRAM)
REM ----- |
REM ----- | |YOU CAN LEAVE THIS VARIABLE WITH A BLANK VALUE IF RUNNING THE PROG WITHOUT ANY PARAMETERS
REM ----- | | 
REM ----- | | |IF THE VALUE CONTAINS THE CHARS  '|'  OR  '<'  OR  '>'  THIS BATCH WILL FAIL TO RUN !!!
REM ----- | | |
REM ----- | | | |YOU CAN APPEND EXTRA TEXT TO THE END OF THE COMMAND BY USING THE AMPERSAND CHARACTER '&'
REM ----- | | | | EXAMPLES:
REM ----- | | | | set _MYPROGRAMSWITCHES_=dir "%systemroot%\system32" /a/o/s/4 & this text will be ignored; useful for adding some inline comments.
REM ----- | | | | set _MYPROGRAMSWITCHES_=dir "%systemroot%\system32" /a/o/s/4         & this works too, and the extra blank spaces will also be ignored.
REM ----- | | | | 
REM ----- | | | | |IF PROG TO BE RUN IS 'CMD.EXE' (WINDOWS COMMAND PROCESSOR), PATH ARGUMENTS MUST POINT TO A SPECIFIC LOCATION
REM ----- | | | | |AND BE ABSOLUTE OR INCLUDE ENVIRONMENT VARIABLES, AND ALWAYS ENCLOSE PATHS IN QUOTES.
REM ----- | | | | | EXAMPLES:
REM ----- | | | | | set _MYPROGRAMSWITCHES_=type "C:\Folder With Spaces\File.txt"
REM ----- | | | | | set _MYPROGRAMSWITCHES_=type "C:\FolderWithoutSpaces\File.txt"
REM ----- | | | | | set _MYPROGRAMSWITCHES_=type "%SYSTEMROOT%\..\Folder With Spaces\File.txt"
REM ----- | | | | | set _MYPROGRAMSWITCHES_=type "%SYSTEMROOT%\..\FolderWithoutSpaces\File.txt"
REM ----- | | | | | set _MYPROGRAMSWITCHES_=type %0                                       <<<<<<<this batch file (quotes are optional; the only exception to the rule)
REM ----- | | | | | set _MYPROGRAMSWITCHES_=type "%~dp0%\..\File.txt"                     <<<<<<<goes back one Dir from this batch file
REM ----- | | | | | set _MYPROGRAMSWITCHES_=type "%~dp0%\..\SomeFolder\File.txt"          <<<<<<<goes back one Dir from this batch file and then forwards into "SomeFolder"
REM ----- | | | | | set _MYPROGRAMSWITCHES_=dir "%systemroot%\system32" /a/o/s/4          <<<<<<<displays directory listing of the System folder. NOTE: 'dir' by itself and
REM ----- | | | | |                                                                                without a specific path argument will resolve to the folder of this batch file.

    set _MYPROGRAMSWITCHES_=--best -v -o getpids-compressed.exe getpids.exe      &// original is 280 KB, will compress down to 88 KB

REM ----- ----------------------------------------
REM ----- |COMMAND-LINE PROGRAM TO BE RUN:  DIRECTORY PATH (OF THE PROGRAM)
REM ----- | 
REM ----- | |YOU CAN LEAVE THIS VARIABLE WITH A BLANK VALUE IF THE PROG IS AT SAME LOCATION AS BATCH
REM ----- | |THIS VARIABLE WILL BE IGNORED IF THE PROG IS 'CMD.EXE'
REM ----- | | 
REM ----- | | EXAMPLES:
REM ----- | | set _MYPROGRAMDIR_=.\                               <<<<<<<relative path, program and batch in same directory
REM ----- | |                                                                  dot backslash *OR* dot (trailing backslash is optional).
REM ----- | | set _MYPROGRAMDIR_=%dp0%                            <<<<<<<relative path, program and batch in same directory
REM ----- | |                                                                  same locatiion as previous but using environment variable.
REM ----- | | set _MYPROGRAMDIR_=..\                              <<<<<<<relative path, program is back one directory from batch
REM ----- | |                                                                  dot dot backslash *OR* dot dot (trailing backslash is optional).
REM ----- | | set _MYPROGRAMDIR_=%dp0%\..                         <<<<<<<relative path, program is back one directory from batch
REM ----- | |                                                                  same as location as previous but using environment variable.
REM ----- | | set _MYPROGRAMDIR_=%SYSTEMROOT%\..\My Utilities     <<<<<<<relative path, program is back one directory from the Windows folder
REM ----- | |                                                                  and then forwards into the folder 'My Utilities'
REM ----- | | set _MYPROGRAMDIR_=C:\My Utilities\                 <<<<<<<absolute path, enclosing quotes are optional; trailing backslash is optional
REM ----- | |                                                                  same location as previous

    set _MYPROGRAMDIR_=

REM ----- ----------------------------------------
REM ----- |SET THE WANTED DIMENSIONS OF THIS CONSOLE WINDOW

    set /a _WINW_=(%_SCREENW_% / 2) + 250
    set /a _WINH_=(%_SCREENH_% / 2) + 150
    set /a _WINX_=(%_SCREENW_% - %_WINW_%) / 2
    set /a _WINY_=(%_SCREENH_% - %_WINH_%) / 2

REM ----- ----------------------------------------
REM ----- |STYLE THIS CONSOLE WINDOW   !!!IMPORTANT!!!
REM ----- |
REM ----- | |IF WE DO NOT USE THE 'MODE' COMMAND HERE ALONG WITH ITS 'COLS/LINES' VALUES THEN
REM ----- | |THE POSITIONING/SIZING OF THIS WINDOW BY 'NIRCMD.EXE' FURTHER DOWN WILL NOT WORK !!!
REM ----- | |
REM ----- | | |SOME COMMANDS WILL OUTPUT A LOT OF LINES AND AND THE CONSOLE DISPLAY WILL BE TRUNCATED
REM ----- | | |RUN THIS FOR AN EXAMPLE=====>   cmd.exe dir "%systemroot%\system32" /a/o/s/4   <=====
REM ----- | | |TO SOLVE THIS PROBLEM, SET THE 'LINES' VALUE OF 'MODE' TO A VERY HIGH NUMBER
REM ----- | | |THE MAXIMUM NUMBER IS 32000 (ON MY SYSTEM); 'MODE' WILL BE IGNORED IF THE NUMBER IS HIGHER !!!   

    color 0A
    mode.com con:cols=%_SCREENW_% lines=10000

REM ----- ----------------------------------------
REM ----- |DELETE THE TEMP TEXT FILE MADE BY 'MonitorInfoView.exe'
REM ----- |COMMENT OUT THE LINE IF YOU DON'T CARE ABOUT DELETING IT

    del /f /q ~TMP.TXT 2>nul >nul

REM >>>>>>>>>> USER INPUT/PREFERENCES ARE ALL SET HERE [END] <<<<<<<<<<<<<<
REM >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


REM ----- RUN THE TASK . . .
nircmd.exe win setsize foreground %_WINX_% %_WINY_% %_WINW_% %_WINH_%
popd

if not defined _MYPROGRAMDIR_ set _MYPROGRAMDIR_=%~dp0
if "!_MYPROGRAMDIR_!" == "." set _MYPROGRAMDIR_=%~dp0
if "!_MYPROGRAMDIR_!" == ".\" set _MYPROGRAMDIR_=%~dp0
pushd %_MYPROGRAMDIR_%
if not exist %_MYPROGRAMDIR_% goto _SKIP_
set _CONVERT_PATH_="%CD%"
set _CONVERT_PATH_=%_CONVERT_PATH_:"=%
set _MYPROGRAMDIR_=%_CONVERT_PATH_%
:_SKIP_
popd

echo ===============================================================================
echo PROGRAM ..............: !_MYPROGRAM_!
if "!_MYPROGRAM_!"=="cmd.exe" (echo PROGRAM DIR ..........: %SYSTEMROOT%\system32) else (echo PROGRAM DIR ..........: !_MYPROGRAMDIR_!)
echo PROGRAM SWITCHES .....: !_MYPROGRAMSWITCHES_!
echo ===============================================================================

if "!_MYPROGRAM_!"=="cmd.exe" (goto _PROGRAM_IS_CMD_) else (goto _PROGRAM_IS_OTHER_)

:_PROGRAM_IS_CMD_
cd /d "%SYSTEMROOT%\system32"
!_MYPROGRAMSWITCHES_!
echo. & echo. & echo.
goto _END_

:_PROGRAM_IS_OTHER_ 
cd /d "!_MYPROGRAMDIR_!"
if "%CD%\!_MYPROGRAM_!" == "%CD%\" goto _ERRORMESSAGE_
if not exist "%CD%\!_MYPROGRAM_!" goto _ERRORMESSAGE_
"!_MYPROGRAMDIR_!\!_MYPROGRAM_!" !_MYPROGRAMSWITCHES_!
echo. & echo. & echo.
goto _END_

:_ERRORMESSAGE_
cls
color 4F
echo ===============================================================================
echo PROGRAM ..............: !_MYPROGRAM_!
echo PROGRAM DIR ..........: !_MYPROGRAMDIR_!
echo PROGRAM SWITCHES .....: !_MYPROGRAMSWITCHES_!
echo ===============================================================================
echo                        ^^!^^!^^!  E R R O R  ^^!^^!^^!
echo.
echo The program has failed to run; the path set by the above values does not exist.
echo Please exit this window and check the values you have set in this batch file.
echo.
echo This batch file is located here:
echo %0
echo. & echo. & echo. & echo. & echo.

:_END_

REM ----- CLEAR VARIABLE VALUES FROM MEMORY . . .
set _PROCESS_ID_=
set _SCREENW_=
set _SCREENH_=
set _MYPROGRAM_=
set _MYPROGRAMSWITCHES_=
set _MYPROGRAMDIR_=
set _WINW_=
set _WINH_=
set _WINX_=
set _WINY_=
set _CONVERT_PATH_=

REM ----- STOP THIS CONSOLE WINDOW FROM CLOSING   !!!IMPORTANT!!! . . .
REM ----- |
REM ----- | http://superuser.com/questions/306167/how-to-prevent-the-command-prompt-from-closing-after-execution
REM ----- | | by 'kitsu.eb' (April 26, 2014)
REM ----- | | | "My solution (just tested on Win7) is to add CMD as the last line in the batch file.
REM ----- | | |  This runs a nested command prompt that inherits the environment of its parent.
REM ----- | | |  That child shell holds the batch process open until you EXIT, at which point the
REM ----- | | |  batch has no child processes and also exits."
REM ----- | Comment . . .
REM ----- | | by me
REM ----- | | | "This is a workaround. You can't use PAUSE as the last command to stop this window from closing
REM ----- | | |  because the window will terminate after you press a key. While this batch is running, if you open
REM ----- | | |  Task Manager/Process Hacker/Process Explorer you will see an extra CMD.EXE child process running
REM ----- | | |  under the parent CMD.EXE of this batch file."
cmd.exe
derty2
источник
Было бы также неплохо скопировать здесь соответствующее содержимое.
Slhck