poniedziałek, 24 lutego 2014

Windows - batch

Manager urządzeń

Można odpalić z cmd przez komenę devmgmt.msc

Pobranie do zmiennej bieżącego katalogu

Przypadkowo zdarzyło mi się że musiałem napisać prosty plik bat. Nie przepadam za skryptami w batch-ach... ale gdy trzeba trudno.
Chciałem sprawdzić bieżący katalog.
Postąpiłem w sposób analogiczny jak dla Linux.
Pewnie jest to jakaś zmienna systemowa.
Okazało się że to nie tak samo...

W przypadku Linux można to sprawdzić przeglądając zawartość zmiennych komendą set
Wartość mamy w PWD
set |less
set |grep PWD=
Chciałem to sprawdzić dla Windows. I co? Okazuje się że szukam a tu nie ma!
set |more
set >c:\test
Można sobie taką zmienną spreparować. Komenda cd zwraca tę wartość.
set PWD="%cd%"
echo %PWD%

... i gotowe

Źródło http://stackoverflow.com/questions/6789491/batch-script-to-set-a-variable-with-the-current-path-location

Szukanie pliku który się uruchomił

I znów pracuję w Windows.
Odpalam konsole cmd. Wydaje polecenie np: java i wykonuje. 
Działa... ale czemu?
Może na początku zaznaczę że polecenia wydaje bez podania pełnej ścieżki. Wygląda tak jak komenda systemu. Niektóre polecenia się wywołują - ot tak - bez podania pełnej ścieżki.
Gdyby się zastanowić, to tak do końca nie wiem co się uruchomiło.
Sprawdzając managera zadań, pewnie zobaczę pełną ścieżkę, ale już po uruchomieniu.
A jak zobaczyć co system wybierze zanim to wykonam?

Wracając do teori w systemie Windows programy są odnajdywane na podstawie ścieżki PATH. Skąd tak na prawdę ten program jest uruchamiany? Jak znasz scieżkę PATH możesz spróbować to prześledzić, ale czy to proste i komu by się to chciało robić.

Okazuje się że można zobaczyć co właściwie system znajduje gdy się poda polecenie - służy do tego where.
where java
 C:\Windows\System32\java.exe
 D:\java\jdk\jdk1.6\bin\java.exe
Teraz już wiem.... wykona C:\Windows\System32\java.exe bo jest pierwsze na liście

W przypadku Linux jest whereis. Wydaje się że where z Windows to właśnie jego odpowiednik.

Rozszerzone polecenia cmd

Chciałem wykonać prosty skrypt do odpalania programu java. Jestem w katalogu X, wywołuje skrypt program.bat z podaniem bezwzględnej ścieżki katalogu Y. W ścieżce Y znajdują się wymagane jary. Trzeba je dodać do wywołania jar-a. Okazuje się że zrobiłem sobie zagadkę.
c:\X> c:\Y\program.bat
Kod program.bat jest prosty:
java -cp .\lib1.jar Class1
Program przy takim wywołaniu się wykłada. Wina to podanie bezwzględnej ścieżki. Ścieżka reprezentowana przez . to c:\X a tu nie ma lib1.jar.

Jak zatem to zrobić aby działało również dla takiego przypadku?
Nie chce przecież w skrypcie mieć zapisanych ścieżek na sztywno!
Czytam więc reference dla cmd. Zabrałem się do tego po lekturze linka poniżej. Należy zwrócić uwagę że I to numer od 0 - n
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
Co ciekawe podobny rezultat dostałem gdy sprawdziłem zawartość %0 podobnie jak dla %~f0 

Idąc tym tropem spróbowałem ustawić zmienną. Wydaje się działać:
set BATH_PATH=%~d0%~p0
Po tych zmianach kod program.bat wygląda tak
set BATH_PATH=%~d0%~p0
java -cp %BATH_PATH%\lib1.jar Class1
Teraz działa tak jak chciałem!

Brak komentarzy:

Prześlij komentarz