Есть ли такая команда, как pushd и popd, которые работают с размером окна консоли, цветом текста и заголовком окна?

Именно то, что говорит название. У меня есть пакетный скрипт, который изменяет разрешение окна консоли, заголовок и цвет текста. Когда он закроется, я бы хотел, чтобы мой скрипт вернул все это обратно к тому, что изначально было у пользователя. Насколько это возможно?


person ditheredtransparency    schedule 14.10.2017    source источник
comment
Пожалуйста, вернитесь ко всем своим предыдущим вопросам и примите ответы на них. Крайне невежливо этого не делать.   -  person Squashman    schedule 14.10.2017
comment
Я понимаю, но я не собираюсь принимать ответ, пока не подтвержу, что предоставленные ответы соответствуют моему вопросу. Я делал это раньше, а потом понял, что что-то не работает, поэтому снова спрашиваю и не получаю ответа.   -  person ditheredtransparency    schedule 15.10.2017
comment
Пока вы говорите о том, что увидит пользователь при первом открытии командной строки, это возможно. Если вы говорите о получении значений current в начале сценария (после того, как пользователь изменил их между открытием командной строки и запуском сценария), это невозможно в пакетном режиме.   -  person SomethingDark    schedule 18.10.2017
comment
Ах хорошо. Спасибо, Что-то темное. Итак, как я могу изменить его обратно на то, что они увидят при первом запуске CMD?   -  person ditheredtransparency    schedule 18.10.2017


Ответы (2)


Вы можете сохранить все эти данные в различных текстовых файлах, например.

set /p title=Create a Title: 
title %title%
break >"title.txt"
echo %title% >>"title.txt"

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

if exist "title.txt" (
    set /p title1=<title.txt
    title %title1%
)
set /p title=Create a Title:
title %title% 
break >"title.txt"
echo %title% >>"title.txt"

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

person Randy Matinee    schedule 14.10.2017
comment
Я ценю ответ, но я хочу, чтобы мой сценарий автоматически сохранял текущий заголовок в качестве переменной, чтобы его можно было восстановить, когда сценарий будет завершен. - person ditheredtransparency; 15.10.2017

Они хранятся в нескольких местах, но в основном находятся в реестре в разделе HKCU\Console. Кроме того, по умолчанию заголовок cmd — это просто путь к cmd.exe, но если вы открыли его с помощью ярлыка, заголовок изменится на имя ярлыка. К сожалению, расположение ярлыка меняется с каждой версией Windows, и невозможно определить, как была открыта командная строка, поэтому мы придерживаемся названия по умолчанию.

Либо вставьте свой другой код в раздел с пометкой «ВАШ ДРУГОЙ КОД ЗДЕСЬ», либо просто оставьте строку с надписью call yourscript.bat.

@echo off

::------------------------------------------------------------------------------
:: Store default values from the registry
::------------------------------------------------------------------------------
call :get_rows_and_columns WindowSize
call :get_rows_and_columns ScreenBufferSize
call :get_HKCU_Console_value ScreenColors
set "default_colors=%hkcu_value:~-2%"

:: Leading zeroes get removed in a reg query which makes things complicated
:: when the default background color is black
set "default_colors=%default_colors:x=0%"

::------------------------------------------------------------------------------
:: YOUR OTHER CODE HERE
::------------------------------------------------------------------------------


::------------------------------------------------------------------------------
:: RESTORE CMD TO ITS ORIGINAL APPEARANCE
::------------------------------------------------------------------------------
call :resize_console %WindowSize_cols% %WindowSize_rows% %ScreenBufferSize_cols% %ScreenBufferSize_rows%

:: Google says the default cmd window title is the path to cmd.exe, which is
:: stored in %COMSPEC%, but I've also seen it be based on the name of the
:: shortcut in %APPDATA%\Microsoft\Windows\Start Menu\Programs\System Tools
:: in Windows 10 or %APPDATA%\Microsoft\Windows\Start Menu\Programs\Accessories
:: in Windows Vista. I don't have a 7, 8, or 8.1 VM so I don't know the paths
:: for those.
title %COMSPEC%
pause
exit /b

::------------------------------------------------------------------------------
:: Gets the registry value of a specified key
::
:: Arguments: %1 - the key to search for
:: Returns:   The value of the registry key
::------------------------------------------------------------------------------
:get_HKCU_Console_value
set "hkcu_value="
for /f "tokens=3" %%A in ('reg query HKCU\Console /v %~1 ^| find "%~1"') do set "hkcu_value=%%A"
exit /b

::------------------------------------------------------------------------------
:: Calculates rows and columns of a screen size based on registry value.
:: According to https://stackoverflow.com/a/10664060/4158862, the decimal value
:: of the registry key is equal to (rows*65536)+columns.
::
:: Arguments: %1 - The registry key to search for
:: Returns:   The number of rows and columns used by that screen
::------------------------------------------------------------------------------
:get_rows_and_columns
set "key=%~1"
call :get_HKCU_Console_value "%key%"
set "%key%Size_hex=%hkcu_value%"
set /a %key%Size_dec=%key%Size_hex + 0
set /a %key%_cols=%key%Size_dec %% 65536
set /a %key%_rows=%key%Size_dec / 65536
exit /b

::------------------------------------------------------------------------------
:: Adjusts the size of both the command prompt window and its line buffer
:: From https://stackoverflow.com/a/13351373/4158862 
::
:: Arguments: %1 - Columns in cmd screen width
::            %2 - Rows in cmd screen width
::            %3 - Columns in buffer width
::            %4 - Rows in cmd screen width
:: Returns:   None
::------------------------------------------------------------------------------
:resize_console
mode con: cols=%1 lines=%2
powershell -command "&{$H=get-host;$W=$H.ui.rawui;$B=$W.buffersize;$B.width=%3;$B.height=%4;$W.buffersize=$B;}"
exit /b
person SomethingDark    schedule 18.10.2017