Normalmente estou usando
echo.|time & my_command & echo.|time
quando não tenho mais nada à mão. Isso faz com que a saída seja a seguinte:
> echo.|time & ping -n 4 localhost > nul & echo.|time The current time is: 18:42:34,63 Enter the new time: The current time is: 18:42:37,68 Enter the new time:
Não é bonito e pode ser mais bonito por meio da canalização para a findstr:
echo.|time|findstr current & ping -n 4 localhost > nul & echo.|time|findstr current
Se você ativou a expansão atrasada por padrão (ou iniciou cmd com /v:on
como argumento), você também pode usar apenas echo !time!
sem precisar recorrer a hacks feios com redirecionamento de entrada.
Se você quiser usar um arquivo de lote, você pode fazer assim:
@echo Start time: %time%
@%*>nul 2>nul
@echo End time: %time%
Eu adicionei redirecionamento para nul para stdout e stderr aqui, porque senão pode ser difícil encontrar as linhas inicial e final. Você pode remover isso se isso não lhe interessar.
Mas hoje em dia eu uso principalmente TimeThis - que até agora foi removido, infelizmente.
O PowerShell oferece um caminho também:
Measure-Command { my_command }
mas você precisa ter cuidado com as coisas que dependem do diretório de trabalho ou do redirecionamento. Para que funcionem corretamente, você pode precisar de um pequeno truque:
@echo off
setlocal enableextensions
rem Prepare current directory and command line so they
rem can be stuck into a single-quoted PowerShell string.
set "Dir=%CD:'=''%"
set "Cmd=%*"
set "Cmd=%Cmd:'=''%"
rem Prepare command to pass to PowerShell
set Command=
set "Command=&{"
set "Command=%Command% Set-Location '%Dir%'"
set "Command=%Command%; [Environment]::CurrentDirectory = '%Dir%'"
set "Command=%Command%; $start = Get-Date"
set "Command=%Command%; Write-Host ' Command line : %Cmd%'"
set "Command=%Command%; Write-Host (' Start time : ' + $start.ToString())"
set "Command=%Command%; Write-Host"
set "Command=%Command%; iex 'cmd /c %Cmd%'"
set "Command=%Command%; $end = Get-Date"
set "Command=%Command%; Write-Host"
set "Command=%Command%; Write-Host ' Command line : %Cmd%'"
set "Command=%Command%; Write-Host (' Start time : ' + $start.ToString())"
set "Command=%Command%; Write-Host (' End time : ' + $end.ToString())"
set "Command=%Command%; Write-Host (' Elapsed time : ' + ($end - $start).ToString())"
set "Command=%Command%; }"
powershell -noprofile -command "%Command%"
endlocal
Isso pode ser executado da mesma forma que timethis
, lembre-se de obter aspas duplas com \"
se elas forem necessárias na linha de comando (o mesmo que timethis
também). A saída produzida é semelhante. Redirecionamentos não funcionarão, no entanto.