Come posso aprire un'applicazione console con una determinata dimensione della finestra?


16

L'applicazione che voglio avviare è MongoDB. Se lo avessi avviato normalmente, si presenta così:

inserisci qui la descrizione dell'immagine

Non mi piace la quantità di interruzioni di linea e ho un sacco di spazio sullo schermo, quindi vorrei utilizzare tale spazio per sbarazzarmi delle interruzioni di linea.

Posso cambiare la dimensione della finestra della console con MODE, quindi ho scritto un file batch come questo:

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

Fin qui tutto bene. Quando avvio questo file batch, ottengo una finestra più grande, come desiderato.

Ma quando ora premo Ctrl+ Cper uscire da MongoDB, ricevo il fastidioso prompt:

Terminate batch job (Y/N)?

Il che è inutile, poiché il comando da cui sono appena uscito è stato l'ultimo comando nel processo batch e indipendentemente dalla risposta, il risultato è lo stesso.

Quindi, come posso ottenere una finestra della console più grande per l'applicazione senza avere quel prompt quando premo Ctrl+ C?

Risposte:


12

Ho impiegato alcune ore oggi per implementare una piccola applicazione C # che può avvolgere un'altra applicazione console e regolare le dimensioni della finestra dell'host console.

console-wrapperè facile da usare. Si aspetta solo un paio di parametri della riga di 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 --heightvengono utilizzati per impostare la dimensione della finestra della console risultante. --subjectpuò essere utilizzato facoltativamente, se viene omesso, i restanti parametri vengono trattati come il comando (con parametri) per l'avvio.

Quindi l'ultima chiamata che sto usando ora nel nostro script di avvio è:

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

La finestra risultante avrà la dimensione richiesta e dopo aver premuto Ctrl+ C, la finestra si chiuderà (dopo aver chiuso correttamente il processo contenuto).


6

Hai mai pensato di eseguirlo da uno script PowerShell? Powershell è in grado di ridimensionare la propria finestra

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

Questo crea una finestra con una dimensione di 150 ma ha anche un buffer scorrevole laterale di 300.


Sì, l'ho considerato, ma non sapevo come implementarlo in quel momento. Funziona perfettamente, tranne per il leggero fastidio che l'esecuzione di script potrebbe essere disabilitata.
Der Hochstapler,

5

Per quanto ho capito la domanda, vuoi che MongoDB abbia la dimensione specificata della finestra della console e che esca quando premi Ctrl+ C. Quindi la risposta è piuttosto semplice: l'uso scorciatoia per avviarlo.

Non ho mongodeseguibile, quindi vorrei usare perl.execome esempio. Quando lo avvii dalla finestra di dialogo Esegui ( Windows+ R), la dimensione della finestra della console sarà 80 × 25 standard con dimensioni del buffer per 300 righe.

  1. Crea un collegamento a mongod (o perlnel mio caso).
  2. Fare clic con il tasto destro del collegamento e fare clic Proprietà .
    1. Nella scheda Collegamento nel campo Destinazione , aggiungi i parametri amongod .
    2. Il campo Start in controlla la directory corrente iniziale del programma avviato. Per impostazione predefinita, sarà la directory in cui si trova .exe.
  3. Fai clic su Layout scheda .
    1. Cambia le dimensioni della finestra a 140 × 70.
      Proprietà del collegamento, scheda Layout
    2. È possibile aumentare la dimensione del buffer Altezza dello schermo a 1000 o più per poter scorrere fino a messaggi più vecchi.
    3. Se si cancella Lascia la finestra di posizione del sistema , è possibile specificare la posizione della finestra della console sullo schermo.
  4. Fare clic su OK per chiudere le proprietà del collegamento.

Ora, quando si fa clic su questo collegamento, la finestra della console sarà della dimensione specificata. Quando si preme Ctrl+ C, l'applicazione si chiude e la finestra si chiude senza ulteriori prompt.


Puoi anche cambiare il layout della finestra dopo averla lanciata dalla finestra di dialogo Esegui . Fare clic con il tasto destro del mouse sul titolo della finestra della console e fare clic su Proprietà . Fare clic sulla scheda Layout , regolare le dimensioni della finestra e fare clic clic OK per chiudere le proprietà e applicare immediatamente le modifiche. (Se la finestra è stata avviata dal collegamento, le proprietà del collegamento vengono aggiornate.)

Al prossimo avvio della stessa applicazione, le dimensioni della finestra della console avranno magicamente le stesse dimensioni. (Non l'ho controllato questa volta ma funzionava.)


La posizione di mongod.exenon è fissa. Cambierà a seconda della distribuzione dell'applicazione. Ecco perché stavo mirando direttamente a una soluzione tramite la console. Quando inserisco un percorso relativo nei campi della directory di destinazione o di lavoro per un collegamento, non li accetterò :(
Der Hochstapler,

@OliverSalzburg Hai provato l'approccio del riavvio del batch ? Voglio dire, il tuo batch si avvia da solo start cmd /ke passa un parametro aggiuntivo o imposta una variabile di ambiente. La seconda istanza cambia quindi le dimensioni della finestra della console e si avvia mongod.exe.
Alexey Ivanov,

Sì, ho provato molte cose. Ma fintanto che è coinvolto un file batch, la soluzione soffrirà del Terminate batch job (Y/N)?prompt: \ In realtà ho appena finito di implementare un'applicazione wrapper per risolverlo per me.
Der Hochstapler,

@OliverSalzburg Sarà un'utilità molto utile. Pensavo anche che un wrapper sarebbe stato l'unico modo ...
Alexey Ivanov,

3

Le impostazioni di layout della console predefinite vivono qui nel registro:

[HKEY_CURRENT_USER\Console]

È possibile modificare queste impostazioni e si applicheranno a TUTTE le finestre di comando che si avviano, indipendentemente dal percorso. Sfortunatamente, i valori grezzi non sono amici dell'uomo.

Per impostarli nel modo desiderato, apri una normale finestra cmd, quindi modifica le impostazioni a tuo piacimento. Cerca nel registro il percorso sopra e dovresti vedere una sottochiave in "Console" per cmd.exe. Esporta la chiave in un file, modifica il percorso in quello sopra e importa o copia semplicemente i valori manualmente dall'uno all'altro. È quindi possibile eliminare la voce specifica cmd.exe. Ora, tutte le finestre di comando che si apriranno utilizzeranno i valori predefiniti modificati.

Ho trovato utile creare un paio di file delle voci di registro con i miei valori predefiniti standard in modo da poterli inserire facilmente su un nuovo server quando eseguo il RDP per la prima volta. Ho creato delle impostazioni predefinite per le due dimensioni che utilizzo in genere.

Per 1024 x 768 (lo uso per server normalmente accessibili tramite uno strumento RDP multi sessione):

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

Per 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

Metti il Startcomando di fronte a chiamare mongodb. Credo che dovrebbe risolverlo.


No, questo apre MongoDB in una nuova finestra della console. Quando lo uso start /blascerà aperta la finestra della console dopo aver premuto Ctrl + C.
Der Hochstapler,

0

Se sei felice di eseguire un file batch insieme a un paio di piccoli programmi di supporto, una soluzione completa è pubblicata da me qui:
Come può un file batch eseguire un programma e impostare la posizione e le dimensioni della finestra?

Contenuto come di seguito. . . .

Questo file batch demo eseguirà un programma da riga di comando e imposterà la posizione e le dimensioni della sua finestra della console del prompt dei comandi. Il tema generale di questo batch è lo stesso delle due precedenti soluzioni (nella pagina StackTranslate.it nel link sopra), ma c'erano alcuni problemi unici e soluzioni alternative per farlo funzionare: questa è una finestra del prompt dei comandi ospitata da 'CMD .EXE 'e non una finestra della GUI come' EXPLORER.EXE '.

Leggi tutti i commenti e la descrizione nel file batch per ulteriori informazioni.

Strumenti utilizzati:
1.   MonitorInfoView  di Nir Sofer (41 KB)
2.   NirCmd  di Nir Sofer (43 KB)
3.   GetPIDs  di Daniel Scheibli (280 KB)
4.   upx.exe  --- è il programma da riga di comando che utilizzeremo per questa demo; posizionarlo nella stessa directory del file batch.
5. Un file batch --- vedi sotto

Raccogli tutti e cinque i file in una directory. Questo è il file batch, pronto per essere eseguito su qualsiasi sistema Windows.

Che cosa farà questo batch demo, oltre a presentare una finestra della console personalizzata, è che verrà eseguito upx.execon le opzioni della riga di comando--best -v -o getpids-compressed.exe getpids.exe. Comprimeremo il nostro strumento "GetPIDs" fino a 88 KB ........ Dopo il lancio, fai doppio clic sulla barra del titolo di questa finestra della console per vedere un fenomeno interessante; questa finestra della console si comporta come una 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

Sarebbe perfettamente bene copiare anche qui i contenuti pertinenti.
slhck,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.