Ostatnio nie mam za dużo czasu na pisanie (praca i studia podyplomowe). Mam za to mały rarytasek dla „dosowych oldschoolowców”. Na potrzeby ułatwienia sobie pracy napisałem mały skrypt w DOS (czy raczej w tym co jest w zamian w Win XP). Wiedzę czerpałem oczywiście z Google i polecenia cośtam /?
Co to robi? Zamienia nazwy wszystkich podkatalogów zastępując spacje podkreślnikami _. Dodatkowo pomija podane przez nas podkatalogi. Miejcie świadomość, że skrypt należy dostosować do swoich wymagań. To co tu jest działa u mnie, a u Was niekoniecznie.
Zawartość pliku szukaj_spacji.bat:
@ECHO OFF
CLS
ECHO. Tworzenie listy plikow z podkatalogami...
c:
CD \katalog
:spacje
REM pobierz liste katalogow pomijajac te podane w nawiasach
DIR /AD /B /S | FINDSTR /V "skrypty rozdzielone" > katalogi.txt
REM sprawdzam czy sa spacje w nazwach
FOR /F "delims=" %%k IN (katalogi.txt) DO (
ECHO %%k|FINDSTR /R /C:" ">nul
IF NOT ERRORLEVEL 1 CALL .\skrypty\popraw_spacje.bat "%%~pk%%~nk"&GOTO spacje
)
ERASE c:\katalog\katalogi.txt
Zawartość pliku popraw_spacje.bat:
@ECHO OFF
IF (%1) == () (
ECHO Mowilem nie uruchamiac samemu!
PAUSE
GOTO :EOF
)
FOR /F "tokens=1*" %%a IN (%1) DO rename %1 "%%a_%%b"
Jak to działa:
- kasuj wyświetlanie komunikatów,
- czyść ekran,
- wyświetl komunikat na ekranie,
- przejdź do miejsca, w którym będą szukane podkatalogi do zmiany nazwy,
- utworzórz etykietę spacje, do której możemy wykonać później skok,
- poleceniem DIR wyświetlamy nazwy podkatalogów w formie uproszczonej (bez podawania ich wielkości itp.), następnie jedziemy na „oszukanej pajpie” Billa G.: DIR przekazuje swoje wyjście na wejście FINDSTR z parametrem /V, dzięki temu zapisuje do pliku katalogi.txt nazwy wszystkich podkatalogów oprócz tych podanych w cudzysłowach (FINDSTR nie jest potrzebny jeżeli nie chcemy pomijać jakichś podkatalogów),
- pętla FOR z parametrem delims wymusza iteracje wraz z końcem linii, a nie tak jak domyślnie każdej spacji,
- znowu pipe: ECHO przekazuje swoje wyjście na wejście FINDSTR, które tym razem szuka spacji w nazwie; jeżeli coś znajdzie i tak wywalane jest do nul (chodzi nam o wygenerowanie ERRORLEVEL czy znalazł spacje czy nie),
- jeżeli znalazł spacje (działa jedynie knif
NOT ERRORLEVEL 1), to wywołuje plik popraw_spacje.bat przekazując mu jako parametr ścieżkę dostępu i nazwę katalogu do zmiany nazwy, - po poprawieniu spacji wymuszany jest skok do kolejnego wygenerowania listy katalogów i tak aż do poprawienia ostatniej spacji w drzewie katalogów,
- kasuje plik txt z nazwami katalogów
Co robi wywoływany plik popraw_spacje.bat:
- Sprawdza czy są podane jakieś argumenty, jeżeli nie, to wyświetla komunikat i za pomocą GOTO :EOF skacze na koniec pliku nie robiąc nic.
- Podany ciąg znaków zostaje rozdzielony na 2 kawałki w miejscu spacji, którye „skleja” znakiem _.
Wnioski z całej tej zabawy:
- DOS jest strasznie toporny. Rolę funkcji najlepiej spełniają osobne pliki bat, które coś tam wykonują i wracają w miejsce wywołania. Stosując etykiety i GOTO często narażasz się na nieskończone pętle (a wtedy pomaga tylko CTRL + C).
- Na każdym kroku trzeba stosować knify wynalezione metodą prób i błędów lub żmudnego przeszukiwania forów internetowych. Czy Bill G. od początku tak to sobie wykombinował?
- Dlaczego „oszukana pajpa”? W systemach uniksopodobnych kolejne wiersze z wyjścia przekazywane na wejście następnego polecenia uruchamiają równoległy proces. W DOS wszystkie wiersze są najpierw zapisywane do pliku tymczasowego, a dopiero potem przekazywane do następnego polecenia.
- Nigdy więcej DOSa
