Wskaźnik postępu w pliku wsadowym podczas działania tracert

0

Mam plik wsadowy, który działa dość szybko, ALE istnieje kilka znaczników, których uruchomienie trwa wiecznie. Chcę znaleźć sposób na pokazanie, że coś się dzieje (NIE pokazuje jednak wyników tracert) podczas jego działania ... Nie musi pokazywać procentu ani nic ... Nawet tylko spinner (/ - nadpisywanie, pojedynczy znak lub tylko seria „.”, które stają się coraz dłuższe. Sztuczka polega jednak na tym, że plik wsadowy musi zasadniczo uruchamiać oba w tym samym czasie, a wskaźnik postępu kończy się, gdy tracert kończy działanie.

Widziałem to: https://stackoverflow.com/questions/14711188/batch-file-progress-spinning-wheel , ale wydaje się, że aktualizuje się tylko między poleceniami (NIE wiele aktualizacji, gdy jedno polecenie jest nadal uruchomione).

Chcę również, aby był to główny plik wsadowy, a nie oddzielny plik (ani też nie korzystałem z narzędzi innych firm, które nie są jeszcze w wersji Server 2003 lub nowszej).

Może być miło, ale wątpliwość naprawdę możliwa ... Pokaż więcej skończonych postępów w oparciu o bieżący skok, na którym działa tracert (IE: 1/15, 2/15, 3/15). (Nie jest potrzebne do zaakceptowania odpowiedzi, ale da mi więcej statusu Super Odpowiadającego ...;)

BondUniverse
źródło
Och, i chciałbym, aby postęp był w jednej linii (chyba że zawija się z powodu długiego działania), a nie tylko kilka znaków w linii, przy czym każda aktualizacja jest w nowej linii.
BondUniverse

Odpowiedzi:

1
@echo off
    setlocal enableextensions disabledelayedexpansion

    rem Assumming there is some kind of log where everything is being written
    set "logFile=output.txt"

    rem Variables we need
    rem .... a variable containing a carriage return for spinner output
    for /f %%a in ('copy "%~f0" nul /z') do set "CR=%%a"

    rem .... a lock file to be used as a indicator of file being written
    rem      we can use the same log file, but included just to handle the
    rem      case where there is no log file
    set "lockFile=%temp%\%~nx0.%random%%random%.lock"

    rem .... the spinner to show
    set "spin=/-\|"

    (   
        9>"%lockFile%" tracert 10.1.1.1 >> "%logFile%"
    ) | <nul >nul 2>&1 ( 
        cmd /v /q /c "for /l %%a in (0) do ( ping -n 2 localhost & set "spin=!spin:~1!!spin:~0,1!" & (( type nul >>"%lockFile%" )&&( del /q "%lockFile%" & exit )||( set /p"=Waiting !spin:~0,1!!CR!" >con  )))"
    )

Aby uzyskać wyjaśnienie krok po kroku (ten sam kod, po prostu podzielony na lepszy odczyt ekranu)

@echo off
    setlocal enableextensions disabledelayedexpansion

    rem Assumming there is some kind of log where everything is being written
    set "logFile=output.txt"


    rem Variables we need
    rem .... a variable containing a carriage return for spinner output
    for /f %%a in ('copy "%~f0" nul /z') do set "CR=%%a"

    rem .... a lock file to be used as a indicator of file being written
    rem      we can use the same log file, but included just to handle the
    rem      case where there is no log file
    set "lockFile=%temp%\%~nx0.%random%%random%.lock"

    rem .... the spinner to show
    set "spin=/-\|"

    rem .... This set of variables just hold the code that will be used
    rem      for each of the steps. They can be removed and placed directly
    rem      in the code below, but as the same will be done by the parser
    rem      this will make documentation easier

    rem .... How we will wait forever until the traceroute process ends
    set "loop= for /l %%a in (0) do "

    rem .... How to include a wait state to save cpu.
    set "wait= ping -n 2 localhost "

    rem .... How to rotate the spinner to later show the correct element
    set "rotateSpin= set "spin=!spin:~1!!spin:~0,1!" "

    rem .... How to show the progress if the tracert is still working
    set "progress= set /p"=Waiting !spin:~0,1!!CR!" >con "

    rem .... How to check if the tracert has ended: Just try to append 
    rem      nothing to the lock file 
    set "check= type nul >>"%lockFile%" "

    rem .... What to do when the traceroute ends. To use the log file
    rem      insted of the generated lock, remember to remove the del
    rem      command, we do not want to delete the log
    set "atEnd= del /q "%lockFile%" & exit "

    rem And here everything is joined. The content of the variables is 
    rem replaced by the parser, generating the final command.

    rem A pipe is generated. The left part of the pipe (the generator)
    rem is the traceroute command, and the right part (the consumer) 
    rem is the code that will generate the spinner.

    rem The lock is hold by redirection of one of the user handles
    rem (here the handle 9 is used) if the left part of the pipe.
    rem When the traceroute command ends, the handle is released.

    rem The right part of the pipe just loops checking if the lock is 
    rem released and echoing the spinner if it has not. This code
    rem runs in a separate cmd instance.

    (   
        9>"%lockFile%" tracert 10.1.1.1 >> "%logFile%"
    ) | <nul >nul 2>&1 ( 
        cmd /v /q /c "%loop% ( %wait% & %rotateSpin% & (( %check% )&&( %atEnd% )||( %progress% )))"
    )
MC ND
źródło
ABSOLUTNIE doskonała !!! Dziękuję Ci! Jedynym sposobem, w jaki mogłoby być lepiej, gdyby nie miał pliku, którego używał, ale aby to zadziałało, jestem całkowicie zadowolony z twojego rozwiązania !!! Uznanie dla komentarzy skryptowych!
BondUniverse
Ostatnia rzecz ... Próba zmiany linii „Oczekiwanie” na „Oczekiwanie ... Gotowe!” kiedy to zrobię, jak mogę to zrobić? Próbowałem umieścić następujący wiersz za twoją częścią, ale wypisuje go dokładnie tak, jak tego chcę, ale po prostu zawiesza się i nie przechodzi do następnego polecenia ...
BondUniverse
Ups, nie mogę tu normalnie ... Oto kod: set /p"=Tracerouting... DONE!" >con
BondUniverse
@BondUniverse, set "atEnd= del /q "%lockFile%" & echo Tracerouting... DONE! >con & exit "
MC ND
Wydaje mi się, że nie mogę tego znaleźć w odpowiednim miejscu kodu ... Gdzie powinien pójść?
BondUniverse