Я использую командную строку Windows в течение нескольких часов в день на работе, и я хочу оживить ситуацию. Я хочу, чтобы цвет текста менялся каждые 1 секунду. У меня есть пакетный скрипт, который делает это.

@echo off
set NUM=0 1 2 3 4 5 6 7 8 9 A B C D E F
for %%x in (%NUM%) do ( 
    for %%y in (%NUM%) do (
        color %%x%%y
        timeout 1 >nul
    )
)

Это приятно меняет цвет моего переднего плана или фона каждую секунду. Однако я хочу, чтобы этот пакетный скрипт запускался автоматически при каждом открытии ярлыка командной строки. Итак, в моих свойствах ярлыка я установил для "Target" следующее:

Ярлык Цель:

C:\Windows\system32\cmd.exe /k auto-change-text-color.bat

Это работает, как и ожидалось, но поскольку командный файл запущен, я не могу использовать командную строку. И вместо этого я просто вижу, как цвет фона меняется время от времени.

Есть ли способ запустить это в фоновом режиме и продолжать использовать командную строку, пока цвета меняются?

Если нет, есть ли другой способ сделать то, что я хочу сделать? Может быть, с помощью Java, Perl или чего-то еще, кроме командного файла?

Спасибо за помощь.

4 ответа4

1

Следующая команда сделает то, что вы хотите:

start /b "" "%COMSPEC%" /c auto-change-text-color.bat

Он запустит экземпляр CMD.EXE (или того, что у вас есть COMSPEC ), работающий в фоновом режиме активного окна консоли, выполняя auto-change-text-color.bat до тех пор, пока не завершится пакетный файл, и в этот момент фон CMD.EXE прекратится.

1

Это немного сложно, потому что вы не хотите, чтобы процесс изменения цвета фона перехватывал ввод вашей консоли. Вы можете добавить параметр /NOBREAK к команде TIMEOUT, чтобы скрипт никогда не читал stdin, за исключением того, что он все еще может обрабатывать прерывание <CTRL-Break> и спрашивать, хотите ли вы завершить сценарий. Пользователь может ответить Y и завершить фоновый процесс, но это может сбить с толку, если основной процесс также имеет запущенный пакетный скрипт. Какой процесс получает вход?

Вы можете перенаправить stdin на nul для фонового процесса, но TIMEOUT завершится ошибкой, если ввод перенаправлен.

Я изменил ваш auto-change-text-color.bat, чтобы использовать задержку PING вместо TIMEOUT, что позволило перенаправить stdin на NUL. Я также поместил одну последнюю команду COLOR в конец, чтобы закончить с более удобочитаемой цветовой комбинацией.

@echo off
set NUM=0 1 2 3 4 5 6 7 8 9 A B C D E F
for %%x in (%NUM%) do (
  for %%y in (%NUM%) do (
    color %%x%%y
    >nul ping localhost -n 2
  )
)
color 07

Следующая команда используется для запуска скрипта в фоновом режиме с перенаправлением stdin на nul:

start "" /b cmd /c "auto-change-text-color.bat <nul"

Единственный странный побочный эффект заключается в том, что фоновый процесс все еще может получить <CTRL-Break> и распечатывает сообщение « Terminate batch job (Y/N)? , но сразу же продолжается, не дожидаясь ввода. Таким образом, вы можете безопасно запустить пакетный скрипт в основном процессе, выполнить <CTRL-Break> и получить два сообщения Terminate, и нажмите Y или N, зная, что ответит только пакетный скрипт в вашем основном процессе (завершить или нет).

0

Спасибо @dbenham и @Woody за вашу помощь. Используя ваши ответы, я смог сделать именно то, что хотел.

В итоге я использовал эту команду в качестве команды auto-change-text-color.bat , потому что мне захотелось просто изменить текст, я хотел, чтобы он продолжался вечно, и избавился от некоторых цветов, которые не очень хорошо смотрелись с помощью белый (F) фон:

@echo off
:loop
set NUM=0 1 2 3 4 5 6 8 9 A B C
for %%x in (%NUM%) do ( 
    color F%%x
    >nul ping localhost -n 4
)
goto loop

Что касается моего ярлыка командной строки Windows, он запускается в моем каталоге разработки, и "цель":

%COMSPEC% /t:F9 /s /k cd scripts && start /b %COMSPEC% /c auto-change-text-color.bat <nul && cd .. && env

Он открывается в каталоге сценариев моей среды разработки, запускает сценарий изменения цвета в фоновом режиме, который хранится в моей папке сценариев, затем возвращается в родительскую папку и запускает другой пакетный файл, задающий все переменные среды. Это идеально. Еще раз спасибо!

-1

В Linux & (амперсанд) используется для запуска фоновой задачи. Я понятия не имею, на Win, но попробуйте C:\Windows\system32\cmd.exe /k auto-change-text-color.bat &

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .