我每天在工作时使用 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
)
)
它每秒都会很好地改变我的前景或背景的颜色。但是,我希望每当我打开命令提示符快捷方式时,这个批处理脚本都会自动运行。因此,在我的快捷方式属性中,我将“目标”设置为:
快捷方式目标:
目录:\Windows\system32\命令执行程序/k自动更改文本颜色.bat
这按预期工作,但由于批处理文件正在运行,我无法使用命令提示符。相反,我只是看到背景颜色偶尔变化。
有没有办法在后台运行它并在颜色改变时继续使用命令提示符?
如果没有,还有其他方法可以完成我想要做的事情吗?也许使用 Java、perl 或批处理文件以外的其他方法?
感谢您的帮助。
答案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,因为您知道只有主进程中的批处理脚本会响应(终止或不响应)。
答案2
以下命令将执行您想要的操作:
start /b "" "%COMSPEC%" /c auto-change-text-color.bat
它将在活动控制台窗口的后台启动一个实例CMD.EXE
(或任何您的实例),执行直到批处理文件结束,此时后台将终止。COMSPEC
auto-change-text-color.bat
CMD.EXE
答案3
感谢@dbenham 和@Woody 的帮助。借助你们的回答,我能够完成我想要做的事情。
我最终用它作为我的自动更改文本颜色.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
它打开我的开发环境的脚本目录,在后台运行存储在我的脚本文件夹中的颜色更改脚本,然后返回到父文件夹并运行另一个批处理文件来设置我的所有环境变量。它很完美。再次感谢您!
答案4
在 Linux 中,&(和号)用于运行后台任务。我不知道在 Windows 上如何,但可以尝试一下,C:\Windows\system32\cmd.exe /k auto-change-text-color.bat &