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

9

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

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

    
por slolife 30.07.2009 / 18:38

6 respostas

19

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.

    
por 30.07.2009 / 18:41
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 no comando que você deseja executar e ela deve fazer o que você deseja.

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

Eu uso um utilitário chamado "agora" para fazer isso, pois vai ecoar a data e 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 preocupa 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

A saída da amostra seria semelhante a

--------------
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
--------------
    
por 30.07.2009 / 18:48
4

outra opção é usar o comando time com /t , que colocará o tempo atual no console (ou redirecionará para um log) sem solicitar que o tempo seja definido. há uma limitação em que lhe dará as horas, minutos, mas não segundos e milissegundos.

call time /t  > myLog.log
call mybat   >> myLog.log
call time /t >> myLog.log
    
por 03.08.2009 / 03:04
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

    
por 13.01.2018 / 14:51
1

Se você tiver o powershell, você pode fazer isso (toda a linha, dividida para legibilidade):

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

Ou salve isso 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())";
    
por 19.07.2012 / 21:48
0

Far Manager 1.x usuários podem considerar Timer .

    
por 17.11.2017 / 13:25