Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

.bat / cmd - logowanie odpowiedzi z copy / md do pliku

MES Mariusz 19 Sep 2016 18:22 2613 17
IGE-XAO
  • #1
    MES Mariusz
    Level 36  
    Witam, potrzebowałbym podpowiedzi / pomocy.

    Skrypt logujący komunikaty systemowe:

    Code: dos
    Log in, to see the code



    Skrypt testujący działanie poprzedniego skryptu:

    Code: dos
    Log in, to see the code


    Skrypt (nie mój zresztą, ale kolegi penknife) ładnie loguje niektóre zdarzenia (test1, test2, czy wieloliniową odpowiedź ipconfig) ale nie potrafi zalogować odpowiedzi z komend takich jak copy czy md. W przypadku copy pewnie dlatego, że pierwszy znak odpowiedzi jest spacją. Ale z drugiej strony md zwraca odpowiedź bez spacji na początku, a też nie jest logowana:

    .bat / cmd - logowanie odpowiedzi z copy / md do pliku

    Prośba o pomoc w rozbudowie funkcjonalności skryptu o logowanie odpowiedzi również z takich komend jak copy lub md.

    Dziękuję.
  • IGE-XAO
  • #2
    JacekCz
    Level 39  
    programy i skrypty mają nie jeden strumień wyjściowy, ale dwa, zwane w duchu C stdout i stderr. W związku z tym typowe przechwycenie strumienia 'out' nie łapie strumienia błędów 'err'. Nie ma to nic wspólnego ze spacją.

    Do tego całkiem możliwe, że niektóre widoczne znaki nie są wyświetlane przez plik (nie przez DOS a przez BIOS)

    PS. skrypt mi się wydaje jak popis nieczytelnego kodu na jakiś pseudohackerski konkurs. Albo napisany do zupełnie innych zastosowań i sztucznie zmuszony do pracy w czym innym. Poprawek w takim skrypcie się NIE PODEJMUJĘ.

    Co jest NAPRAWDĘ celem, bo wygląda jakbyś użył czołgu M3 Lee do zabicia muchy z lewej strony.
  • #3
    MES Mariusz
    Level 36  
    Każdy komputer w sieci lan na początku pobiera sobie z dysku sieciowego plik autoexec.bat, następonie każda z maszyn wykonuje ten skrypt przy starcie systemu. Dzięki temu maszyny z zamrożonymi dyskami (Reboot Restore Rx) mogą zostać "konfigurowane" bez ingerencji w zamrożony dysk (zamrożony - z nomenklatury DeepFreeze - taki, dla którego wszystkie zmiany poczunione przez użytkownika są zapominane przy każdym restarcie.

    Każdy skrypt loguje prawidłowość bądź błędy wykonywanych czynności dzięki czemu jestem w stanie stwierdzić, czy skrypt na danej maszynie wykonał się prawidłowo, ewentualnie namierzyć problem.

    Przykładowy log:

    Code:
    2016-09-12_18:34:44,93 - autostart-adam.bat: skrypt montujacy dyski zostal wrzucony do autostartu
    
    2016-09-12_18:34:45,09 - autostart-adam.bat: inicjalizacja skryptu ladowania generalnych ustawien systemu
    2016-09-12_18:34:45,17 - load-general-settings.bat: aktywowany v.2016-09-08
    2016-09-12_18:34:45,25 - load-general-settings.bat: ustawianie format daty: yyyy-MM-dd
    2016-09-12_18:34:45,32 - load-general-settings.bat: Ustawianie klucza: HKU\.Default\Control Panel\International
    2016-09-12_18:34:45,49 - load-general-settings.bat: sShortDate    REG_SZ    yyyy-MM-dd
    2016-09-12_18:34:45,59 - load-general-settings.bat: Ustawianie klucza: HKCU\Control Panel\International
    2016-09-12_18:34:45,76 - load-general-settings.bat: sShortDate    REG_SZ    yyyy-MM-dd
    2016-09-12_18:34:45,88 - load-general-settings.bat: Ustawianie klucza: HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers
    2016-09-12_18:34:46,02 - load-general-settings.bat: 0    REG_SZ    192.168.1.1
    2016-09-12_18:34:46,10 - load-general-settings.bat: Synchronizacja czasu z serwerem NTP: 192.168.1.1
    2016-09-12_18:34:47,27 - load-general-settings.bat: The command completed successfully.
    2016-09-12_18:34:49,39 - load-general-settings.bat: Usˆuga Windows Time jest wˆa˜nie uruchamiana.
    2016-09-12_18:34:49,46 - load-general-settings.bat: Pomy˜lnie uruchomiono usˆug© Windows Time.
    2016-09-12_18:34:49,60 - load-general-settings.bat: The command completed successfully.
    2016-09-12_18:34:49,74 - load-general-settings.bat: Sending resync command to local computer
    2016-09-12_18:34:49,82 - load-general-settings.bat: The following error occurred: Odmowa dost©pu. (0x80070005
    2016-09-12_18:34:49,96 - autostart-adam.bat: pobrano i zaktualizowano skrypt logowania komunikatow
    2016-09-12_18:34:50,09 - autostart-adam.bat: pobrano i zaktualizowano skrypt montowania dyskow
    2016-09-12_18:34:50,16 - autostart-adam.bat: inicjalizacja skryptu montowania dyskow
    2016-09-12_18:34:50,24 - mount-drives-adam.bat: aktywowany v.4.0
    2016-09-12_18:34:53,07 - mount-drives-adam.bat: dysk e zamontowano poprawnie
    2016-09-12_18:34:53,47 - mount-drives-adam.bat: dysk p zamontowano poprawnie
    2016-09-12_18:34:54,38 - mount-drives-adam.bat: dysk r zamontowano poprawnie
    2016-09-12_18:35:00,03 - mount-drives-adam.bat: dysk w zamontowano poprawnie
    2016-09-12_18:35:02,80 - mount-drives-adam.bat: dysk x zamontowano poprawnie
    2016-09-12_18:35:02,00 - mount-drives-adam.bat: dysk z zamontowano poprawnie
    2016-09-12_18:35:03,31 - mount-drives-adam.bat: zamontowano dyski sieciowe
    2016-09-12_18:35:06,59 - Uruchom-NAS.bat: wybudzono serwer NAS
    2016-09-12_18:35:07,83 - mount-drives-adam.bat: aktywowany v.4.0
    2016-09-12_18:35:09,10 - autostart-adam.bat: dodano na pulpit ikone montowania dyskow sieciowych
    2016-09-12_18:35:09,23 - mount-drives-adam.bat: dysk e zamontowano poprawnie
    2016-09-12_18:35:09,35 - mount-drives-adam.bat: dysk p zamontowano poprawnie
    2016-09-12_18:35:09,46 - mount-drives-adam.bat: dysk r zamontowano poprawnie
    2016-09-12_18:35:09,51 - autostart-adam.bat: dodano na pulpit ikone odmontowania dyskow sieciowych
    2016-09-12_18:35:09,69 - mount-drives-adam.bat: dysk x zamontowano poprawnie
    2016-09-12_18:35:09,83 - mount-drives-adam.bat: dysk z zamontowano poprawnie
    2016-09-12_18:35:09,96 - mount-drives-adam.bat: zamontowano dyski sieciowe
    2016-09-12_18:35:10,07 - autostart-adam.bat: dodano na pulpit ikone wybudzania serwera samby
    2016-09-12_18:35:10,83 - autostart-adam.bat: pobrano i zaktualizowano skrypt watchdoga
    2016-09-12_18:35:10,97 - autostart-adam.bat: inicjalizacja skryptu watchdoga
    2016-09-12_18:35:11,15 - watchdog.bat: aktywowany v. 2016-09-04
    2016-09-12_18:35:11,28 - watchdog.bat: oczekiwanie na uruchomienie procesow nadzorowanych
    2016-09-12_18:35:19,64 - mount-drives-adam.bat: aktywowany v.4.0
    2016-09-12_18:35:21,21 - mount-drives-adam.bat: dysk e zamontowano poprawnie
    2016-09-12_18:35:21,52 - mount-drives-adam.bat: dysk p zamontowano poprawnie
    2016-09-12_18:35:21,86 - mount-drives-adam.bat: dysk r zamontowano poprawnie
    2016-09-12_18:35:22,06 - mount-drives-adam.bat: dysk w zamontowano poprawnie
    2016-09-12_18:35:22,29 - mount-drives-adam.bat: dysk x zamontowano poprawnie
    2016-09-12_18:35:22,49 - mount-drives-adam.bat: dysk z zamontowano poprawnie
    2016-09-12_18:35:22,62 - mount-drives-adam.bat: zamontowano dyski sieciowe
    2016-09-12_18:35:41,28 - watchdog.bat: rozpoczeto nadzorowanie wybranych procesow
  • IGE-XAO
  • Helpful post
    #4
    JacekCz
    Level 39  
    Ogólny schemat przekierowań jest taki:

    Code: dos
    Log in, to see the code

    I skutek w zasadzie się uzyskuje


    Code: dos
    Log in, to see the code


    Piszę "w zasadzie" bo wiele jest min, pierwsze z brzegu nie da się pisac do wspólnego strumienia "program nie może uzyskac dostępu do pliku" ale z kolei ten komunikat nie jest przechwycony

    Problemy są również takie (wisi, czeka na przerwanie. Autor widzę też miał z tym problem, ale go zamiótł pod dywan)

    Code: dos
    Log in, to see the code



    W ogóle dla mnie to jak domek z kart, pińcet rzeczy może się stać, o połowie z nich nie będzie informacji.
    Z tego co wiem na dziś wspieramym narzędziem jest Power Shell. Jakie to masz windowsy?
  • #5
    MES Mariusz
    Level 36  
    Windows 10, czyli na czasie. I ile linię poleceń znam od wielu lat i coś tam jestem w stanie sklecić, o tyle Power Shell jest dla mnie całkowitą nowością (nie znam). Stąd pewnie byłoby mi jeszcze trudniej.

    Dzięki za dodatkowe informacje o strumieniach. Przyjmuję do wiadomości, że trudno to (logowanie) jednym uniwersalnym skryptem ogarnąć, natomiast może przynajmniej uda mi się ogarnąć odpowiedzi od copy, którego błędy też po omacku trudno wychwycić (brak pliku, brak dostępu do lokalizacji, uprawnień zapisu itp).

    Jeśli oczywiście przyjdzie ci kiedyś do głowy fajny pomysł na to jak to sprytniej ogarnąć, podziel się proszę.

    Dziękuję i pozdrawiam.
    Mariusz
  • #6
    JacekCz
    Level 39  
    MES Mariusz wrote:
    Windows 10, czyli na czasie. I ile linię poleceń znam od wielu lat i coś tam jestem w stanie sklecić, o tyle Power Shell jest dla mnie całkowitą nowością (nie znam). Stąd pewnie byłoby mi jeszcze trudniej.
    ...


    Myślę że nie. To normalny język o klarownej pisowni z normalnym 'if' oraz pętlami. Cokolwiek znasz, c, php, cokolwiek, odnajdziesz się. To raczej na odwrót, BAT jest boczną uliczką, tworem niepodobnym do niczego, woła się pod-shella z wszelkimi robaczkami zamiast wywołać funkcję. Samo wywołanie sub-shella jest czynnością która może się nie powieść bez diagnostyki.
    Niby jakoś DOS czerpał z Unixa (numery strumieni, podstawowa koncepcja przekierowania), ale spie... wszystko (fakt, mieli olbrzymie ograniczenia). Za czasów prawdziwego DOS-a w ambitniejszych wdrożeniach zamieniałem shella z COMMAND.COM na 4DOS, miał ify, zmienne, pętle itd...

    Nie jestem mistrzem Power Shella, sam (tzw "stary dziad") się tego uczę, ale to ma sens.

    To co robisz (kopiowanie, ustawianie rejestru), ma pewne podobieństwo do pracy instalatora, podrzuciłbym pomysł Inno Setup skryptowany w pewnego rodzaju pascalu. Wiem, że robi to bezpiecznie, kontrolując sukces/porażkę. Uzyskałbyś binarny program (jeden plik EXE) .... to taka rada udzielana z rękami w kieszeniach
  • #7
    MES Mariusz
    Level 36  
    Też myślałem o InnoSetup, tylko, że.

    1). Ktoś pewnie musiałby to przy starcie komputera uruchamiać i przeklikać (aplikacja okienkowa)

    2). Zmiana jakiejś funkcjonalności wymagałaby każdorazowej kompilacji całości.

    A tak - potrzebujesz jakiejś zmiany - wchodzisz tylko na dysk sieciowy, edytujesz pojedynczy z wielu skryptów, zapisujesz i wychodzisz. Nic więcej robić nie musisz a przy następnym restarcie wszystkie maszyny zaczynają działać tak jak chcesz.
  • #8
    JacekCz
    Level 39  
    MES Mariusz wrote:
    Też myślałem o InnoSetup, tylko, że.

    1). Ktoś pewnie musiałby to przy starcie komputera uruchamiać i przeklikać (aplikacja okienkowa)



    Są tryby nienadzorowane pokrewne z trybem instalacji MSI (na pewno w administracji przez domenę). Coś czytałem, nie używałem.
  • Helpful post
    #9
    penknife
    Level 21  
    przed '|" dodaj
    Code:
    2>&1
    Czyli strumień błędu dopisz do standardowego strumienia wyjścia
    np.
    Code: dos
    Log in, to see the code


    JacekCz wystarczyłoby:
    Code: dos
    Log in, to see the code

    A co do "przerwania" to raczej informacja jakby jakimś cudem użytkownik sam po prostu uruchomił:
    Code:
    log.bat /fifo
    , które wymaga strumienia wejściowego, a którego nie dostanie(spróbuj to wykryć w batch), wówczas wyświetli mu się informacja o naciśnięciu Ctrl+Z oraz Enter.
  • #10
    MES Mariusz
    Level 36  
    penknife wrote:
    przed '|" dodaj
    Code:
    2>&1
    Czyli strumień błędu dopisz do standardowego strumienia wyjścia
    np.
    Code: dos
    Log in, to see the code


    Coś jakby chciało zadziałać, ale nie do końca.

    Zawartość testslog.bat

    Code: dos
    Log in, to see the code


    W pliku 2016-09-27-LAPTOP-LENOVO-Mariusz.log pojawia się:

    Code:
    2016-09-27_21:32:31,73 - testslog.bat: A subdirectory or file test already exists.


    i to jest OK.

    Nie loguje się natomiast odpowiedź od copy. Odpowiedź nie pojawia się także w konsoli:

    co dzieje się też bezpośrednio w konsoli:

    .bat / cmd - logowanie odpowiedzi z copy / md do pliku
  • #11
    JacekCz
    Level 39  
    tam jest odsyłanie drugiego stderr w niebyt, może tam się chowa diagnoza?

    Ale odpadam, język BAT jest dla mnie niekonserwowalny, nie dający panowania itd
    W ogóle nie jest to język programowania spełniający minimalne zwyczajowe wymagania.
  • #12
    MES Mariusz
    Level 36  
    Nie do końca łapię, dlaczego polecenie:

    Code: dos
    Log in, to see the code


    Elegancko zapisze komunikaty zwrotne z obu sytuacji - w pliku out1.txt znalazły się dwa wiersze:

    Code: dos
    Log in, to see the code


    odpowiednio dla wykonanych poleceń:

    Code: dos
    Log in, to see the code



    Tymczasem gdy przekazuje się te parametry do skryptu logs.bat tą metodą:

    Code: dos
    Log in, to see the code


    notowany jest wyłącznie komunikat o błędzie (podczas gdy komunikat o powodzeniu jest tracony).

    Dla przypomnienia wklejam zawartość logs.bat

    Code: dos
    Log in, to see the code
  • #13
    penknife
    Level 21  
    spróbuj dołączyć jeszcze: 3>&1
    P.S. na xp nawet 2>&1 nie trzeba było przy copy
  • #14
    JacekCz
    Level 39  
    penknife wrote:
    spróbuj dołączyć jeszcze: 3>&1
    P.S. na xp nawet 2>&1 nie trzeba było przy copy


    Czym tą 'trójkę' uzasadnisz?
    Wg tego co wiem, nic nie jest 'trójką'
  • #15
    MES Mariusz
    Level 36  
    penknife wrote:
    spróbuj dołączyć jeszcze: 3>&1
    P.S. na xp nawet 2>&1 nie trzeba było przy copy


    Code: dos
    Log in, to see the code


    Też nie chce zadziałać.
  • #16
    JacekCz
    Level 39  
    MES Mariusz wrote:
    penknife wrote:
    spróbuj dołączyć jeszcze: 3>&1
    P.S. na xp nawet 2>&1 nie trzeba było przy copy


    Code: dos
    Log in, to see the code


    Też nie chce zadziałać.


    Kolega nie odezwał się. Wg mnie z tą trójką po prostu strzelił w płot.
    Trzy standardowe handlery plików mają numer 0,1,2
    Handler ew dowolnego innego pliku będzie miał wartość przypadkową i nie będzie globalny. Tylko trzy stanową środowisko wykonania programu.
  • #18
    JacekCz
    Level 39  
    MES Mariusz wrote:
    Zastanawia mnie też, dlaczego, polecenie wykonane z palca zaloguje oba przypadki, a przekazane do skryptu wyłącznie komunikat o błędzie.


    Na swój własny użytek to rozumiem tak, że wywołanie sub-skryptu w środowisku BAT narusza pewne dobre zwyczaje jakie znamy z oprogramowania, czystość kontekstu, separację, klarowny powrót z odtworzeniem poprzedniego środowiska.
    Na tę chwilę nie pamiętam jakie, zbędna wiedza podległa resetowi, ale są z pewnością.

    Dlatego już nigdy nie będę robił złożonych rzeczy w BAT