A maneira mais fácil de cronometrar uma ferramenta de linha de comando

9

Qual é a maneira mais fácil / rápida de cronometrar uma ferramenta de linha de comando?

Não precisa ser super preciso (+/- segundos é bom), pois espero que isso leve alguns minutos ou até 1 hora +. E escrever um arquivo em lotes também é bom. Além disso, ele não precisa fazer cálculos a tempo, basta exibir a hora de início e a hora de término.

slolife
fonte
Pode pertencer ao Stackoverflow.
314 Joey
2
Se eu tiver que "programar" algo para que isso funcione ... a solução é muito complicada. Deve haver alguma ferramenta de linha de comando ou solução simples de lote para isso, não?
Slolife 30/07/09
Provavelmente no Serverfault.
227 Kirill V. Lyadvinsky
Geralmente, o sistema operacional se preocupa apenas com o tempo de CPU usado. Minha resposta abaixo fará o que você quiser. Eu apenas uso um arquivo de log para armazenar as informações.
Axxmasterr

Respostas:

19

Eu normalmente estou usando

echo.|time & my_command & echo.|time

quando não tenho mais nada em mãos. Isso causa uma saída como a seguinte:

> eco. | hora e ping -n 4 localhost> nul e eco. | hora
O horário atual é: 18: 42: 34,63
Digite o novo horário:
O horário atual é: 18: 42: 37,68
Digite o novo horário:

Não é bonito e pode ser mais bonito canalizando para findstr:

echo.|time|findstr current & ping -n 4 localhost > nul & echo.|time|findstr current

Se você atrasou a expansão ativada por padrão (ou iniciou o cmd com /v:ono argumento), você também pode usar echo !time!sem precisar recorrer a hacks feios com redirecionamento de entrada.

Se você deseja usar um arquivo em lotes, pode fazê-lo assim:

@echo Start time: %time%
@%*>nul 2>nul
@echo End time: %time%

Eu adicionei redirecionamento para nul para stdout e stderr aqui, porque, caso contrário, pode ser difícil encontrar as linhas de início e de fim. Você pode removê-lo se isso não lhe interessar.

Mas hoje em dia uso principalmente o TimeThis - que até agora foi removido, infelizmente.

O PowerShell também oferece uma maneira:

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 alguns truques:

@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 maneira que timethis, evite aspas duplas \"se forem necessárias na linha de comando (o mesmo timethistambém). A saída produzida é semelhante. Os redirecionamentos não funcionarão, no entanto.

Joey
fonte
TimeThis é do kit de recursos do Windows 2000 e não está mais disponível; em 2003, o Resource Kit é o TimeIt, que não funcionou no meu Win7 de 64 bits. Para uma solução do PowerShell, consulte superuser.com/questions/228056/…
pesche
Isso é péssimo. Eu ainda tenho o executável por aqui desde os velhos tempos, no entanto.
Joey
@escesc: eu adicionei um arquivo em lotes que pode funcionar como um substituto para o drop-in timethis.
Joey
4

Você pode usar o agendador do sistema para executar o comando para você.

Painel de controle -> Tarefas agendadas -> criar novo ....

Basta apontar a tarefa agendada para o comando que você deseja executar e deve fazer o que você deseja.

Se você deseja criar um arquivo de log que armazene informações sobre o estado do tempo, considere fazer algo semelhante ao script acima.

Eu uso um utilitário chamado "now" para fazer isso, pois ecoará a data e a hora. Isso é muito útil para scripts de linha de comando que você deseja acompanhar nos arquivos de log, mas não possui inteligência para incluir uma data / hora nativamente. Muito útil, pois não se importa com uma resposta e desaparece quando você termina.

Agora o Utlity pode ser encontrado aqui

Exemplo de script seria ...

echo -------------- >>logfile.txt
now Process Starting>> logfile.txt
<commandhere> <target> >> logfile.txt
now process Ending >> logfile.txt
echo -------------- >> logfile.txt

Saída de amostra seria semelhante

--------------
Mon Mar 06 14:58:48 2009 Process Starting
GNU Super Duper Process PID 12345! Success
Mon Mar 06 21:47:01 2009 Process Ending
--------------
Axxmasterr
fonte
4

outra opção é usar o timecomando com o /tqual colocará o tempo limite atual no console (ou redirecionará para um log) sem solicitar o tempo a ser definido. existe uma limitação, pois fornecerá horas, minutos, mas não segundos e milissegundos.

call time /t  > myLog.log
call mybat   >> myLog.log
call time /t >> myLog.log
akf
fonte
Infelizmente, "time / t" não produz segundos, apenas "hour: minute am / pm".
Slolife 03/08/09
Você está certo, eu atualizei a resposta.
akf
1

Se você possui PowerShell, pode fazer isso (tudo em uma linha, dividida para facilitar a leitura):

PS C:\> $startTime=Get-Date;ping /n 4 localhost;$endTime=Get-Date;
        echo "Finished in $(($endTime-$startTime).ToString())"

Ou salve-o em um arquivo para facilitar a reutilização.

# usage: .\timer.ps1 program [arguments]

$startTime = Get-Date;
$prog = $args[0];
$progargs = $args[1..($args.length-1)];

&$prog $progargs

$endTime = Get-Date;

echo "Finished in $(($endTime - $startTime).ToString())";
roufamatic
fonte
1
In command prompt:
 wmic path win32_operatingsystem get LocalDateTime
 wmic path win32_operatingsystem get LocalDateTime
 wmic path win32_operatingsystem get LocalDateTime

Output:
C:\Users\Steini> wmic path win32_operatingsystem get LocalDateTime
LocalDateTime
20180113135409.370000+000

C:\Users\Steini>wmic path win32_operatingsystem get LocalDateTime
LocalDateTime
20180113135409.525000+000

C:\Users\Steini>wmic path win32_operatingsystem get LocalDateTime
LocalDateTime
20180113135409.627000+000

15,5ms e 10,2ms usando Ctrl + v da área de transferência

Steini
fonte
0

Os usuários do Far Manager 1.x podem considerar o plugin Timer .

Vadzim
fonte