Cmd的doskey怎么输入百分号%?【想让所有命令都自动显示 所费时间】

问题背景:想让所有命令都自动显示 所费时间
cmd没有alias,但有doskey(多年没有用,一搜才想起以前用的很多的)
没有计算时间差的命令,命令前后自动显示当前时间也行
所以写了 doskey r=echo %time%[ $T $* $T echo ]%time%
但实际使用 r dir \ 时,发现%time%是 doskey设置r(a时刻)时的时间,而不是我希望的执行r dir \(b时刻)的时间。。。。
即百分号在doskey设置时就被解释替换了。。。。
如何能让百分号保留到b时刻才解释替换?

显示命令执行结束时的时间,可以通过 prompt 命令修改命令提示符来实现。比如,默认的命令提示符是:

C:\>

可以使用 prompt $t$g 的形式将其替换为其他形式。比如:

C:\>prompt$t$g
20:18:15.92>

可以看到,执行上述命令后,命令提示符已经变成了 时:分:秒> 的格式。这个时间是该命令提示符出现的时间,也可以理解为,上一个命令执行结束的时间。比如:

20:20:37.86>dir
 驱动器 C 中的卷没有标签。
 卷的序列号是 3AFD-BD9C

 C:\ 的目录

2024/05/27  10:03                87 diskpart.script
2024/12/04  19:46    <DIR>          DOWNLOADS
2024/12/04  17:36    <DIR>          Intel
2019/12/07  17:14    <DIR>          PerfLogs
2024/12/04  18:12    <DIR>          Program Files
2024/12/04  17:56    <DIR>          Program Files (x86)
2023/03/30  09:51    <DIR>          setup
2023/03/29  17:44    <DIR>          Users
2024/08/30  10:02    <DIR>          Windows
               1 个文件             87 字节
               8 个目录 89,289,539,584 可用字节

20:20:40.43>

如果想进一步自定义命令提示符,可以执行 prompt /? 查看操作指南。

参考资料:

2 个赞

装个clink+oh-my-posh/starship。

嗯,看来提示符更简单有效。

记得大学里写过prompt的什么技巧发表过一页的,居然忘了它。。。。

但是,这个方法不能记录命令开始执行的时间,换言之,可能还是无法计算程序运行所需的准确时间。

要记录开始时间,我目前能想到的就是在要执行的命令前面加一个 echo %time% &,比如:

22:04:22.60> echo %time% & dir
22:04:42.88
 驱动器 C 中的卷没有标签。
 卷的序列号是 3AFD-BD9C

 C:\Users\lib 的目录

2024/12/04  18:34    <DIR>          .
2024/12/04  18:34    <DIR>          ..
2024/12/04  18:35                35 .ash_history
2024/12/04  17:41    <DIR>          .ipython
2024/12/04  17:47    <DIR>          .jupyter
2024/12/04  18:34    <DIR>          .matplotlib
2024/12/04  18:15               560 .viminfo
2023/03/29  17:26    <DIR>          3D Objects
2023/03/29  17:26    <DIR>          Contacts
2024/12/04  19:41    <DIR>          Desktop
2024/12/04  18:13    <DIR>          Documents
2024/01/08  15:27    <DIR>          Downloads
2023/03/29  17:26    <DIR>          Favorites
2023/03/29  17:26    <DIR>          Links
2023/03/29  17:26    <DIR>          Music
2023/03/29  17:31    <DIR>          OneDrive
2024/01/08  15:20    <DIR>          Pictures
2023/03/29  17:26    <DIR>          Saved Games
2023/03/29  17:28    <DIR>          Searches
2023/04/07  10:42    <DIR>          Videos
               2 个文件            595 字节
              18 个目录 89,145,417,728 可用字节

22:04:42.89>

绕得太远了。。。。doskey都有点绕了

不过doskey怎么使用%、转义规则 还是没,好像它的说明都没提

doskey可以自动给任何命令前后 加 额外命令,
只是额外命令里的环境变量是 加的时候 就替换了,而不是执行时才替换。
想到一个变通办法是把 echo %time%写进一个小bat,额外命令是运行这个小bat。不过prompt比doskey简单很多(唯一缺点是 如果命令输出很多行时,前的prompt时间信息被覆盖看不到了。每次执行需要计时的命令,先多敲一次回车)。

最准确也不计成本的做法:前的命令 记录当前时间到临时文件x,后的命令 执行一个算时间的程序(读入x文件,用当前时间减之,输出时间间隔)

:sweat_smile: nushell吧,这个不远。 powershell也行呀,说真的如果是linux用户这个都是基操,美化以下shell而已,微软的cmd没办法太过DIY。

你不知道老系统的痛苦。
2015年安装的win7,任何安装程序都无法运行了,包括更新powershell的版本,所以仿linux的网络下载安装平台就不会有了。
一台2017年的Win10,刚刚想写个按上面思路读写环境变量计算时间差的程序,发现hlp文件无法正确打开,需要安装winhlp32.exe的补丁,下载了这个补丁,运行它只有好几分钟的正在更新,最后是失败。。。。
真的服了现在的微软

最后还是写了读环境变量计算时间差的exe,把doskey的方法实现了,
还需要2个bat

启动cmd窗口自动一次性执行的设置bat

@echo off
prompt $t $p$g
z:
if exist z:\runtime.exe goto a
copy d:\install\runtime.exe z:\
copy d:\install\runtimeb.bat z:\
:a
doskey r=z:\runtimeb.bat $T $* $T z:\runtime.exe

每次执行前自动运行的runtimeb.bat

@echo off
set runtimeb=%time%

使用效果:

2024年12月05日  22:24    <DIR>          Windows
               1 个文件          1,024 字节
              20 个目录 34,227,974,144 可用字节

23:44:00.21 Z:\>b=23:44:00.19
e=23:44:00.231
used=00:00:00.041

23:44:00.23 Z:\>