Komputer & Internet

w domu i zagrodzie

[DOS] Szukacz plików

MS-DOS Batch

W artykule o wyszukiwaniu plików w DOS nauczyliśmy się jak używać DIR do wyszukiwania plików i katalogów na jednym, określonym dysku. A co kiedy dysków jest kilka i nie mamy pewności na którym może być poszukiwany plik? Cóż, nie pozostaje nam nic innego jak użyć DIR na każdym dysku:

dir c:\szukany_plik.txt /s /b
dir d:\szukany_plik.txt /s /b
dir e:\szukany_plik.txt /s /b
...etc

Bez sensu jest powtarzanie tego samego polecenia. Prawda? Zwłaszcza, że dysków może być znacznie więcej. Ale powłoka tekstowa oferuje przetwarzanie wsadowe, możemy więc zlecić tę bezsensowną czynność skryptowi. Do dzieła.

Skrypt bat

Otwórzmy nowy dokument w najlepszym edytorze skryptów, który zapiszemy jako szukaj.bat lub szukaj.cmd. Wcześniej jednak wpiszemy poniższy kod:

@echo off

rem Jesli nie podano argumentu, idz do pomocy
if  "%1"=="" goto help

	rem Podano argument
	for %%x in (c: d: e: f: g:) do (

		dir %%x\%1 /s /b

	)

goto end

:help
	rem Nie podano argumentu, wyswietlam pomoc
	echo Program wyszukuje pliki na dyskach twardych
	echo Wywolanie programu: %0% plik.roz

:end
	rem koniec skryptu

Opis skryptu

  • Wiersze 3, 16, 21, w kolorze zielonym, to komentarze. Są ignorowane i nie mają żadnego wpływu na wykonywanie skryptu, ale przydają się. Każdy komentarz zaczyna się poleceniem rem.
  • Wiersze 15 i 20, kolor czerwony, to etykiety. Etykieta zaczyna się od dwukropka (:) i jest czymś w rodzaju zakładki w kodzie oznaczającej miejsce do którego można wykonać skok, np instrukcją goto etykieta – patrz wiersz 4 (goto help), czy 13 (goto end).
  • Wiersz 1, @echo off wyłącza wyświetlanie poszczególnych poleceń skryptu. Natomiast @ przed poleceniem echo zapobiega wyświetleniu tego polecenia.
  • Wiersz 4. if „%1″==”" goto help – instrukcja warunkowa. Jeśli pierwszy argument (%1) jest równy (==) pustemu ciągowi znaków („”), to skocz to „zakładki” o nazwie help. – Równy pustemu, czyli nie ma argumentu.
    Natomiast jeśli podano jakiś argument, w naszym przypadku ma to być nazwa szukanego pliku, to jest wykonywana następna instrukcja.
  • Wiersz 7 – początek i wiersz 11 – koniec. Pętla for. Zadaniem pętli jest powtarzanie wszystkich instrukcji od wiersza 8 do 9, dla wszystkich argumentów zawartych w nawiasach: (c: d: e: f: g:). Zmienna %%x zawiera aktualnie przetwarzany argument.
  • Wiersz 9. dir %%x\%1 /s /b – szukanie pliku. Polecenie DIR z przełącznikami już znamy. Nowe jest użycie zmiennych: %%x\%1, które w trakcie wykonywania skryptu zawierają:
    • %%x – kolejne litery dysków: c:, d:, e:, etc – określone w wierszu 7.
    • %1 – podana, jako argument polecenia szukaj, nazwa pliku.

Sprawdzamy czy nasz skrypt działa.

c:\>szukaj hosts
c:\WINDOWS\system32\drivers\etc\hosts
Urządzenie nie jest gotowe.
System nie może odnaleźć określonej ścieżki. 
System nie może odnaleźć określonej ścieżki. 
System nie może odnaleźć określonej ścieżki. 

Działa! Ale co mają znaczyć te dziwne komunikaty: „Urządzenie nie jest gotowe” i „System nie może odnaleźć określonej ścieżki„? Nie można jakoś pozbyć się ich?
Można. „Urządzenie nie jest gotowe”, bo to napęd CD bez płyty. Natomiast pozostałe komunikaty informują o tym, iż system nie posiada tych dysków.

Skrypt poniżej już nie ma tych mankamentów.

@echo off

rem Jesli nie podano argumentu, idz do pomocy
if  "%1"=="" goto help

	rem Podano argument
	for %%x in (c: d: e: f: g:) do (

		%%x 2>nul
		dir %%x\%1 /s /b 2>nul

	)

goto end

:help
	rem Nie podano argumentu, wyswietlam pomoc
	echo Program wyszukuje pliki na dyskach twardych
	echo Wywolanie programu: %0% plik.roz

:end
	rem koniec skryptu

Zostały one usunięte dzięki przekierowaniu dojścia STDERR do urządzenia nul.
Aha, można jeszcze rozszerzyć listę przeszukiwanych napędów, dodając brakujące, od h: do z:.

Tags:

About

View all posts by

POST A COMMENT


Aby udowodnić, że jesteś człowiekiem, a nie spambotem proszę wykonać test poniżej.


*