Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

MES Mariusz 19 Wrz 2016 18:22 1599 17
  • #1 19 Wrz 2016 18:22
    MES Mariusz
    Poziom 36  

    Witam, potrzebowałbym podpowiedzi / pomocy.

    Skrypt logujący komunikaty systemowe:

    Kod: dos
    Zaloguj się, aby zobaczyć kod



    Skrypt testujący działanie poprzedniego skryptu:

    Kod: dos
    Zaloguj się, aby zobaczyć kod


    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ę.

    0 17
  • #2 20 Wrz 2016 09:57
    JacekCz
    Poziom 36  

    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.

    0
  • #3 20 Wrz 2016 10:38
    MES Mariusz
    Poziom 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

    0
  • Pomocny post
    #4 20 Wrz 2016 11:00
    JacekCz
    Poziom 36  

    Ogólny schemat przekierowań jest taki:

    Kod: dos
    Zaloguj się, aby zobaczyć kod

    I skutek w zasadzie się uzyskuje


    Kod: dos
    Zaloguj się, aby zobaczyć kod


    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)

    Kod: dos
    Zaloguj się, aby zobaczyć kod



    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?

    0
  • #5 20 Wrz 2016 11:27
    MES Mariusz
    Poziom 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

    0
  • #6 20 Wrz 2016 11:43
    JacekCz
    Poziom 36  

    MES Mariusz napisał:
    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

    0
  • #7 20 Wrz 2016 11:58
    MES Mariusz
    Poziom 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.

    0
  • #8 20 Wrz 2016 12:02
    JacekCz
    Poziom 36  

    MES Mariusz napisał:
    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.

    0
  • Pomocny post
    #9 21 Wrz 2016 00:53
    penknife
    Poziom 20  

    przed '|" dodaj

    Code:
    2>&1
    Czyli strumień błędu dopisz do standardowego strumienia wyjścia
    np.
    Kod: dos
    Zaloguj się, aby zobaczyć kod


    JacekCz wystarczyłoby:
    Kod: dos
    Zaloguj się, aby zobaczyć kod

    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.

    0
  • #10 27 Wrz 2016 21:41
    MES Mariusz
    Poziom 36  

    penknife napisał:
    przed '|" dodaj
    Code:
    2>&1
    Czyli strumień błędu dopisz do standardowego strumienia wyjścia
    np.
    Kod: dos
    Zaloguj się, aby zobaczyć kod


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

    Zawartość testslog.bat

    Kod: dos
    Zaloguj się, aby zobaczyć kod


    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

    0
  • #11 28 Wrz 2016 10:17
    JacekCz
    Poziom 36  

    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.

    0
  • #12 29 Wrz 2016 07:10
    MES Mariusz
    Poziom 36  

    Nie do końca łapię, dlaczego polecenie:

    Kod: dos
    Zaloguj się, aby zobaczyć kod


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

    Kod: dos
    Zaloguj się, aby zobaczyć kod


    odpowiednio dla wykonanych poleceń:

    Kod: dos
    Zaloguj się, aby zobaczyć kod



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

    Kod: dos
    Zaloguj się, aby zobaczyć kod


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

    Dla przypomnienia wklejam zawartość logs.bat

    Kod: dos
    Zaloguj się, aby zobaczyć kod

    0
  • #13 16 Paź 2016 18:45
    penknife
    Poziom 20  

    spróbuj dołączyć jeszcze: 3>&1
    P.S. na xp nawet 2>&1 nie trzeba było przy copy

    0
  • #14 16 Paź 2016 18:53
    JacekCz
    Poziom 36  

    penknife napisał:
    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ą'

    0
  • #15 18 Paź 2016 07:53
    MES Mariusz
    Poziom 36  

    penknife napisał:
    spróbuj dołączyć jeszcze: 3>&1
    P.S. na xp nawet 2>&1 nie trzeba było przy copy


    Kod: dos
    Zaloguj się, aby zobaczyć kod


    Też nie chce zadziałać.

    0
  • #16 18 Paź 2016 09:42
    JacekCz
    Poziom 36  

    MES Mariusz napisał:
    penknife napisał:
    spróbuj dołączyć jeszcze: 3>&1
    P.S. na xp nawet 2>&1 nie trzeba było przy copy


    Kod: dos
    Zaloguj się, aby zobaczyć kod


    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.

    0
  • #18 18 Paź 2016 10:36
    JacekCz
    Poziom 36  

    MES Mariusz napisał:
    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

    0