Como posso abrir um aplicativo de console com um determinado tamanho de janela?


16

O aplicativo que quero iniciar é o MongoDB. Se eu iniciar normalmente, fica assim:

insira a descrição da imagem aqui

Não gosto da quantidade de quebras de linha e tenho muito espaço na tela; portanto, gostaria de utilizar o referido espaço para nos livrar das quebras de linha.

Como posso alterar o tamanho da janela do console MODE, escrevi um arquivo em lotes como este:

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

Por enquanto, tudo bem. Quando inicio esse arquivo em lotes, recebo uma janela maior, conforme desejado.

Mas quando agora pressiono Ctrl+ Cpara sair do MongoDB, recebo o prompt irritante:

Terminate batch job (Y/N)?

O que é inútil, porque o comando do qual acabei de sair era o último comando no trabalho em lotes de qualquer maneira e não importa o que eu responda, o resultado é o mesmo.

Então, como posso obter uma janela maior do console para o aplicativo sem ter esse prompt quando clico em Ctrl+ C?

Respostas:


12

Passei algumas horas hoje para implementar um pequeno aplicativo C # que pode agrupar outro aplicativo de console e ajustar o tamanho da janela do host do console.

console-wrapperé fácil de usar. Ele espera apenas alguns parâmetros de linha de comando:

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

--widthe --heightsão usados ​​para definir o tamanho da janela do console resultante. --subjectpode ser usado opcionalmente, se for omitido, os parâmetros restantes serão tratados como o comando (com parâmetros) para iniciar.

Portanto, a chamada final que estou usando agora em nosso script de inicialização é:

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

A janela resultante terá o tamanho solicitado e, ao pressionar Ctrl+ C, a janela será fechada (após o desligamento adequado do processo).


6

Você já pensou em executá-lo a partir de um script do PowerShell? O Powershell é capaz de redimensionar sua própria janela

$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.

Isso cria uma janela com um tamanho de 150, mas também possui um buffer de rolagem lateral de 300.


Sim, eu considerei, mas não sabia como implementá-lo no momento. Isso funciona perfeitamente, exceto pelo leve incômodo de que a execução de scripts possa ser desativada.
Der Hochstapler

5

Tanto quanto entendi a pergunta, você deseja que o MongoDB tenha o tamanho especificado da janela do console e saia quando pressionar Ctrl+ C. Então a resposta é bem simples: use o atalho para iniciá-lo.

Não tenho mongodexecutável, então usaria perl.execomo exemplo. Quando você o inicia na caixa de diálogo Executar ( Windows+ R), o tamanho da janela do console seria 80 × 25 padrão com tamanho de buffer para 300 linhas.

  1. Crie um atalho para mongod(ou perlno meu caso).
  2. Clique com o botão direito do mouse no atalho e clique em Propriedades .
    1. Na guia Atalho no campo Destino , adicione parâmetros a mongod.
    2. O campo Iniciar em controla o diretório atual inicial do programa iniciado. Por padrão, será o diretório em que .exe está localizado.
  3. Clique na guia Layout .
    1. Altere o tamanho da janela para 140 × 70.
      Propriedades de atalho, guia Layout
    2. Você pode aumentar o tamanho do buffer Altura da tela para 1000 ou mais para poder rolar até as mensagens mais antigas.
    3. Se você desmarcar a janela Deixe a posição do sistema , poderá especificar o local da janela do console na tela.
  4. Clique em OK para fechar as propriedades do atalho.

Agora, quando você clicar nesse atalho, a janela do console terá o tamanho especificado. Quando você pressiona Ctrl+ C, o aplicativo sai e a janela fecha sem nenhum aviso adicional.


Você também pode alterar o layout da janela depois de iniciá-la na caixa de diálogo Executar . Clique com o botão direito do mouse no título da janela do console e clique em Propriedades . Clique na guia Layout , ajuste o tamanho da janela e clique em OK para fechar as propriedades e aplicar as alterações imediatamente. (Se a janela foi iniciada a partir do atalho, as propriedades do atalho são atualizadas.)

Na próxima vez que você iniciar o mesmo aplicativo, o tamanho da janela do console será magicamente do mesmo tamanho. (Eu não o verifiquei desta vez, mas costumava funcionar.)


A localização de mongod.exenão é fixa. Isso mudará dependendo da implantação do aplicativo. É por isso que eu estava buscando uma solução diretamente pelo console. Quando coloco um caminho relativo nos campos de destino ou diretório de trabalho para um atalho, ele não os aceita :(
Der Hochstapler

@OliverSalzburg Você tentou a abordagem de reiniciar o lote ? Quero dizer, seu lote inicia-se via start cmd /ke passa um parâmetro adicional ou define uma variável de ambiente. A segunda instância altera o tamanho da janela do console e inicia mongod.exe.
Alexey Ivanov

Sim, eu tentei muitas coisas. Mas enquanto houver um arquivo em lotes envolvido, a solução sofrerá com o Terminate batch job (Y/N)?prompt: \ Na verdade, acabei de implementar um aplicativo wrapper para resolver isso para mim.
Der Hochstapler

@OliverSalzburg Será um utilitário muito útil. Eu também pensei um invólucro seria a única maneira ...
Alexey Ivanov

3

As configurações padrão de layout do console estão aqui no registro:

[HKEY_CURRENT_USER\Console]

Você pode modificar essas configurações e elas serão aplicadas a TODAS as janelas de comando iniciadas, independentemente do caminho. Infelizmente, os valores brutos não são amigáveis ​​ao ser humano.

Para defini-los da maneira que você deseja, abra uma janela de cmd comum e edite as configurações ao seu gosto. Procure no registro no caminho acima e você verá uma subchave em "Console" para cmd.exe. Exporte essa chave para um arquivo, altere o caminho para o acima e importe ou copie manualmente os valores de um para o outro. Você pode excluir a entrada específica do cmd.exe. Agora, todas as janelas de comando que abrirem usarão os padrões modificados.

Achei útil criar alguns arquivos de entrada do registro com meus padrões padrão, para que eu possa inseri-los facilmente em um novo servidor quando eu fizer o RDP pela primeira vez. Fiz predefinições para os dois tamanhos que normalmente uso.

Para 1024 x 768 (eu uso isso para servidores normalmente acessados ​​através de uma ferramenta RDP de várias sessões):

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

Para 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

Coloque o Startcomando na frente de chamar mongodb. Eu acredito que deveria consertar isso.


Não, isso abre o MongoDB em uma nova janela do console. Quando o uso start /b, deixa a janela do console aberta depois que eu pressiono Ctrl + C.
Der Hochstapler

0

Se você estiver feliz em executar um arquivo em lotes juntamente com alguns pequenos programas auxiliares, uma solução completa será postada por mim aqui:
Como um arquivo em lotes pode executar um programa e definir a posição e o tamanho da janela?

Conteúdo como abaixo. . . .

Esse arquivo em lote de demonstração executará um programa de linha de comando e definirá a posição e o tamanho da janela do console do Prompt de Comando. O tema geral deste lote é o mesmo das duas soluções anteriores (na página Estouro de pilha no link acima), mas havia alguns problemas e soluções alternativas para fazer esse trabalho - esta é uma janela de prompt de comando hospedada por 'CMD .EXE 'e não uma janela da GUI como' EXPLORER.EXE '.

Leia todos os comentários e a descrição no arquivo em lotes para obter mais informações.

Ferramentas utilizadas:
1.   MonitorInfoView  por Nir Sofer (41 KB)
2.   NirCmd  por Nir Sofer (43 KB)
3.   GetPIDs  por Daniel Scheibli (280 KB)
4.   upx.exe  --- é o programa de linha de comando que usaremos para esta demonstração; coloque-o no mesmo diretório que o arquivo em lotes.
5. Um arquivo em lote - veja abaixo

Reúna todos os cinco arquivos em um diretório. Este é o arquivo em lotes, pronto para ser executado em qualquer sistema Windows.

O que esse lote de demonstração fará, além de apresentar uma janela personalizada do console, é executado upx.execom as opções da linha de comando--best -v -o getpids-compressed.exe getpids.exe. Vamos compactar nossa ferramenta 'GetPIDs' para 88 KB ........ Após o lançamento, clique duas vezes na barra de título da janela do console para ver um fenômeno interessante; essa janela do console se comporta como uma GUI!

@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

Seria perfeitamente bom copiar o conteúdo relevante aqui também.
slhck
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.