Systemy operacyjne 6
Z Wikipedii, wolnej encyklopedii.
Spis treści [schowaj] |
Obiekty standardowe w WSH
W skład środowiska WSH wchodzi szereg obiektów dostarczających metody, które pozwalają na zarządzanie szeroką gamą elementów systemu operacyjnego. Podstawowym obiektem, który dostarcza najważniejsze metody jest WScript. Metody w nim zawarte pozwalają między innymi na utworzenie instancji pozostałych klas standardowych.
Obiekt WScript
Obiekt WScript jest podstawowym obiektem środowiska WSH. Własności WScript przechowują dane o wykonaniu i parametrach uruchomienia skryptu. Metody WScript pozwalają na sterowanie wykonaniem skryptu oraz na zarządzanie obiektami.
Metody WScript:
CreateObject
tworzy obiekt określony nazwą. Składnia:
WScript.CreateObject(strProgID[,strPrefix])
Echo
pozwala na wyświetlenie komunikatu na ekranie (lub konsoli).
Quit
służy do kończenia pracy skryptu.
Sleep
wstrzymuje skrypt na zadaną liczbę milisekund.
Własności WScript:
Application
przechowuje obiekt aplikacji skryptu.
Arguments
przechowuje obiekt argumentów (opis poniżej).
FullName
przechowuje nazwę (wraz ze ścieżką) interpretera WSH
Name
przechowuje nazwę opisową interpretera WSH
Path
przechowuje scieżkę dostępu do interpretera WSH
ScriptFullName
przechowuje przechowuje płną nazwę (wraz ze ścieżką) wykonywanego skryptu
ScriptName
przechowuje przechowuje przechowuje nazwę wykonywanego pliku
StdErr
przechowuje obiekt strumienia błędów (tylko CScript)
StdIn
przechowuje obiekt strumienia wejściowego (tylko CScript)
StdOut
przechowuje obiekt strumienia wyjściowego (tylko CScript)
Obiekt WshArguments
Własności WshArguments:
Item
zawiera listę parametrów linii poleceń.
Length
zawiera liczbę znaków danego parametru.
Count
przechowuje liczbę parametrów.
Przykład (należy uruchomić na konsoli przy pomocy CScipt i podac jakieś prametry):
Set objArgs = WScript.Arguments
For I = 0 to objArgs.Count - 1
WScript.Echo objArgs(I)
Next
Obiekt WshEnvironment
Metody WshEnvironment:
Remove
Metoda usuwa zmienną środowiskową. Składnia:
object.Remove(strName)
Własności WshEnvironment:
Item
zawiera listę dostępnych zmiennych.
Length
przechowuje długość danej zmiennej.
Count
przechowuje liczbę dostępnych zmiennych.
Przykład:
Set WshShell = WScript.CreateObject("WScript.Shell")
Set WshSysEnv = WshShell.Environment("SYSTEM")
WScript.Echo WshSysEnv("NUMBER_OF_PROCESSORS")
Obiekt WshNetwork
Metody WshNetwork:
EnumPrinterConnection
zwraca listę dostępnych drukarek. Składnia:
objPrinters = object.EnumPrinterConnections
Przykład:
Set WshNetwork = WScript.CreateObject("WScript.Network")
Set oPrinters = WshNetwork.EnumPrinterConnections
For i = 0 to oPrinters.Count -1
WScript.Echo oPrinters.Item(i)
Next
AddPrinterConnection
Mapuje drukarkę sieciową dostępną dla programów DOSowych. Składnia:
object.AddPrinterConnection strLocalName, strRemoteName[,bUpdateProfile][,strUser][,strPassword]
Przykład:
Set WshNetwork = CreateObject("WScript.Network")
WshNetwork.AddPrinterConnection "LPT1", \\Server\Print1
AddWindowsPrinterConnection
Mapuje drukarkę sieciową w systemie Windows. Składnia:
object.AddWindowsPrinterConnection(strPrinterPath)
Przykład:
Set WshNetwork = CreateObject("WScript.Network")
PrinterPath = "\\printserv\DefaultPrinter"
PrinterDriver = "Lexmark Optra S 1650"
WshNetwork.AddWindowsPrinterConnection PrinterPath, PrinterDriver
RemovePrinterConnection
usuwa mapowanie drukarki.
SetDefaultPrinter
ustawia wybraną drukarkę jako domyślną. Składnia:
object.SetDefaultPrinter strPrinterName
Przykład:
Set WshNetwork = WScript.CreateObject("WScript.Network")
WshNetwork.AddPrinterConnection "LPT1:", "\\Server\Print1"
WshNetwork.SetDefaultPrinter "\\Server\Print1"
EnumNetworkDrives - zwraca listę dysków sieciowych. Składnia
objDrives = object.EnumNetworkDrive
Przykład:
Set WshNetwork = WScript.CreateObject("WScript.Network")
Set oDrives = WshNetwork.EnumNetworkDrives
For i = 0 to oDrives.Count -1
WScript.Echo oDrives.Item(i)
Next
MapNetworkDrive
mapuje dysk sieciowy. Składnia:
object.MapNetworkDrive strLocalName, strRemoteName, [bUpdateProfile], [strUser], [strPassword]
Przykład:
Set WshNetwork = WScript.CreateObject("WScript.Network")
WshNetwork.MapNetworkDrive "Z:", "\\Server\Share"
RemoveNetworkDrive
usuwa dysk sieciowy. Składnia:
object.RemoveNetworkDrive strName, [bForce], [bUpdateProfile]
Przykład:
Set WshNetwork = WScript.CreateObject("WScript.Network")
WshNetwork.MapNetworkDrive "Z:", "\\Server\Share"
WshNetwork.RemoveNetworkDrive "Z:"
ComputerName
przechowuje nazwę komputera
UserDomain
przechowuje bieżącą domenę
UserName
przechowuje nazwę użytkownika
Przykład:
Set objNet = WScript.CreateObject("WScript.Network")
WScript.Echo objNet.ComputerName & " - " & objNet.UserName
Obiekt WshShell
Metody WshShell:
AppActivate
aktywuje wybrane okno.
CreateShortcut
tworzy skrót. Przykłady:
'Utworzenie skrótu do wykonywanego skryptu
Set WshShell = WScript.CreateObject("WScript.Shell")
Set oShellLink = WshShell.CreateShortcut("Current Script.lnk")
oShellLink.TargetPath = WScript.ScriptFullName
oShellLink.Save
'Utworzenie skrótu do strony WWW
Set oUrlLink = WshShell.CreateShortcut("Microsoft Web Site.URL")
oUrlLink.TargetPath = "http://www.microsoft.com"
oUrlLink.Save
LogEvent
zapisuje zdarzenie do pliku WSH.log
Popup
pokazuje okienko z zadaną treścią. Składnia:
IntButton = object.Popup(strText, [natSecondsToWait], strTitle], [natType])
Przykład:
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Popup "Where do you want to go today?"
RegDelete
Usunięcie wpisu z rejestru
RegRead
Odczytanie wartości z rejestru
RegWrite
Wpisanie wartości do rejestru
Przykład:
'Utworzenie klucza "Key" i wartości "Value"
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.RegWrite "HKCU\ScriptEngine\Value", "Some string value"
WshShell.RegWrite "HKCU\ScriptEngine\Key\", 1 ,"REG_DWORD"
'Odczytanie wartości "Value" i wartości domyślnej klucza "Key"
WScript.Echo WshShell.RegRead("HKCU\ScriptEngine\Value")
WScript.Echo WshShell.RegRead("HKCU\ScriptEngine\Key\")
'Usunięcie klucza i wartości
WshShell.RegDelete "HKCU\ScriptEngine\Value"
WshShell.RegDelete "HKCU\ScriptEngine\Key\"
Run
pozwala na uruchomienie dowolnej aplikacji. Składnia:
object.Run (strCommand, [intWindowStyle], [bWaitOnReturn])
Przykład:
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run ("%windir%\notepad" & WScript.ScriptFullName)
SendKeys Metod
pozwala na symulację naciśnięć klawiszy. Przykład:
set WshShell = CreateObject("WScript.Shell")
WshShell.Run "calc"
WScript.Sleep 100
WshShell.AppActivate "Calculator"
WScript.Sleep 100
WshShell.SendKeys "1{+}"
WScript.Sleep 500
WshShell.SendKeys "2"
WScript.Sleep 500
WshShell.SendKeys "~"
WScript.Sleep 500
WshShell.SendKeys "*3"
WScript.Sleep 500
WshShell.SendKeys "~"
WScript.Sleep 2500
Zadania
Napisz skrypt wyświetlający Architekturę, identyfikator oraz wersję procesora (pobierz informację ze zmiennych systemowych)
Napisz skrypt startowy dla użytkownika. mapujący jego katalog domowy oraz drukarkę. Dodaj go do ustawień użytkownika.
Uzupełni poprzedni skrypt w taki sposób aby pokazywał czas poprzedniego logowania (zapamietaj ten czas w rejestrze)
Wybrane rozszerzenia WSH
Obsługa strumieni
Obiekt WSript posiada własności StdIn, StdOut i StdErr, które reprezentująca standardowe strumienie programu konsolowego. Ze ezględu na charakter tych własności, strumienie przez nie przechowywana, można używać tylko po uruchomieniu skryptu poleceniem 'CScript'.
Strumień StdOut
Strumień StdOut pozwala na wysłanie danych na standardowy strumień wyjściowy (domyślnie konsolę). Posiada następujące metody:
Write
wysyła tekst bez znaku końca linii
WriteLine
wysyła tekst ze znakiem końca linii
WriteBlankLines
wysyła puste linie (znaki końca linii)
Przykład:
Set objNetwork = Wscript.CreateObject("Wscript.Network")
Set objStdOut = WScript.StdOut
objStdOut.Write "User: "
objStdOut.Write objNetwork.UserDomain
objStdOut.Write "\"
objStdOut.Write objNetwork.UserName
objStdOut.WriteBlankLines(1)
objStdOut.WriteLine objNetwork.ComputerName
objStdOut.Write "Informacje pobrane."
objStdOut.Close
Strumień StdIn
Strumień StdIn pozawala na odczytywanie danych ze standardowego strumienia wejściowego (domyślnie konsoli). Posiada następujące metody:
Read
odczytuje określoną liczbę znaków
ReadLine
odczytuje jedną linię (do wciśnięcia Enter na konsoli - znaku końca linii)
ReadAll
odczytuje cały dostarczony strumień (ma zastosowanie w przypadku danych pochodzących z innego programu)
Skip
pomija określoną liczbę znaków
SkipLine
pomija określoną liczbę linii
AtEndOfLine
sprawdza czy wystąpił koniec linii
AtEndOfStream
sprawdza czy wystąpił koniec danych/pliku
Przykład:
Wscript.StdOut.Write "Podaj liczbę dziesiętną: "
strDecimal = Wscript.StdIn.ReadLine
Wscript.StdOut.WriteLine strDecimal & " jest równe " & Hex(strDecimal) & " heksadecymalnie."
Istnieje możliwość przekierowania strumieni do programu wywołanego przez skrypt WSH. Użyć należy wówczas obiektów StdIn i StdOut przechowywanych w obiekcie zwracanym przez metodę Exec. Poniżej przykład przekierowania strumienia z programu test.bat:
Dim WshShell, oExec, input
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("test.bat")
input = ""
Do While True
If Not oExec.StdOut.AtEndOfStream Then
input = input & oExec.StdOut.Read(1)
If InStr(input, "dowolny klawisz . . .") <> 0 Then Exit Do
End If
WScript.Sleep 100
Loop
oExec.StdIn.Write " "
Do While oExec.Status <> 1
WScript.Sleep 100
Loop
Plik test.bat dla powyższego przykładu może mieć postać:
@echo "Start pliku wsadowego"
@pause
Obsługa plików i folderów
WSH dysponuje rozszerzeniem pozwalającym na niemalże nieograniczony dostęp do dysków logicznych, folderów oraz plików. Obiekt, który pozwala na zarządzanie systemem plików to Scripting.FileSystemObject.
Najważniejsze obiekty wchodzące w skład FileSystemObject to:
Drive
Obiekt reprezentujący dysk logiczny. Przykład zastosowania obiektu tego typu:
Dim oFSO
Set oFSO = WScript.CreateObject("Scripting.FileSystemObject")
WScript.Echo oFSO.GetDrive("C:").RootFolder.Path
Folder
Obiekt reprezentujący folder. Przykład zastosowania obiektu tego typu:
Dim oFSO
Set oFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set oFolder = oFSO.GetFolder("C:\DeleteMe")
oFolder.Delete
lub alternatywnie:
Dim oFSO
Set oFSO = WScript.CreateObject("Scripting.FileSystemObject")
oFSO.DeleteFolder "C:\DeleteMe"
File
Obiekt reprezentujący plik. Przykład zastosowania obiektu tego typu:
Dim oFSO
Set oFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set oFile = oFSO.GetFile("C:\MyFile.txt")
oFile.Copy "D:\MyFile.txt"
Podobnie jak w przypadku folderu można użyć składni alternatywnej:
Dim oFSO
Set oFSO = WScript.CreateObject("Scripting.FileSystemObject")
If oFSO.FileExists("C:\MyFile.txt") Then
OFSO.CopyFile "C:\MyFile.txt", "D:\MyFile.txt"
End If
TextStream
Obiekt pozwalajacy na zapis do plikow tekstowych. Przykład zastosowania:
Dim oFSO, oTS
Set oFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set oTS = oFSO.CreateTextFile("C:\MyOutput.txt")
oTS.WriteLine "Hello, world!"
oTS.Close
WScript.Echo "All done!"
Dokładny opis metod dostarczanych przez FileSystemObject można znaleźć na stronie:
Inne zastosowania WSH
Możliwości interpretera WSH oraz zastosowania skryptów w Windows są praktycznie nieograniczone. Najlepsze pojęcie o ty co można uzyskać dzięki skryptom daje przeglądanie gotowych skryptów napisanych przez administratorów systemów Windows. Bogata biblioteka skryptów znajduje sie na poniższej stronie:
Zadania
Napisz skrypt zapisujący informacje o systemie do pliku tekstowego
Napisz skrypt pobierający liczby z pliku i wyświetlający ich sumie (odszukaj funkcje odczytującą z pliku)
Aplikacje zewnętrzne w WSH
Wysyłanie klawiszy
Najprostsza metoda współpracy skryptów WSH z aplikacjami zewnętrznymi polega na wysyłaniu komunikatów, odpowiadających wciskaniu klawiszy. Poprzez kombinacje sterujące można doprowadzić do wykonania prawie dowolnych działań na zewnętrznych aplikacjach.
Znak +, ^, %, ~, (, oraz ) mają specjalne znaczenie dla metody SendKey. Aby przekazać je jako parametr do tej metody należy umieścić je w nawiasach klamrowych {}. Przykładowo, jeśli chcemy wysłać znak + do tej metody wprowadzimy następującą linijkę:
WshShell.SendKeys("{+}");
Podobnie wygląda sprawa z nawiasami (), [] oraz {}, które jeśli chcemy przekazać do metody SendKey musimy umieścić w nawiasach klamrowych. Pokazuje to poniższy przykład:
var WshShell = WScript.CreateObject("WScript.Shell");
WshShell.Run("notepad.exe");
WScript.Sleep(200);
WshShell.SendKeys("{{}");
// Nowa linia
WshShell.SendKeys("~");
WshShell.SendKeys("{(}");
WshShell.SendKeys("~");
WshShell.SendKeys("{[}");
WshShell.SendKeys("~");
WshShell.SendKeys("{~}");
WshShell.SendKeys("~");
Warto zwrócić uwagę, iż niektóre z klawiszy nie generują widocznych na ekranie znaków. W poniższej tabeli zawarto kody dla klawiszy specjalnych, które mogą być przekazane do metody SendKey
Klawisz |
Kod |
Backspace |
{BACKSPACE}, {BS}, {BKSP} |
Break |
{BREAK} |
Caps Lock |
{CAPSLOCK} |
Delete |
{DELETE} lub {DEL} |
Kursor w dół |
{DOWN} |
End |
{END} |
Enter |
{ENTER} lub ~ |
Esc |
{ESC} |
Help |
{HELP} |
Home |
{HOME} |
Insert |
{INSERT} lub {INS} |
Kursor w lewo |
{LEFT} |
Num Lock |
{NUMLOCK} |
Page Down |
{PGDN} |
Page Up |
{PGUP} |
{PRTSC} |
|
Kursor w prawo |
{RIGHT} |
Scroll lock |
{SCROLLLOCK} |
Tab |
{TAB} |
Kursor w górę |
{UP} |
F1 |
{F1} |
F2 |
{F2} |
F3 |
{F3} |
F4 |
{F4} |
F5 |
{F5} |
F6 |
{F6} |
F7 |
{F7} |
F8 |
{F8} |
F9 |
{F9} |
F10 |
{F10} |
F11 |
{F11} |
F12 |
{F12} |
F13 |
{F13} |
F14 |
{F14} |
F15 |
{F15} |
F16 |
{F16} |
Aby wysłać jako parametr metody kombinację klawiszy, np. Ctrl+V należy posłużyć się specjalnym kodem odpowiadającym klawiszom Shift, Ctrl oraz Alt. Kody tych klawiszy zestawione są w poniższej tabelce.
Klawisz Specjalny |
Kod klawisza |
Shift |
+ |
Ctrl |
^ |
Alt |
% |
W celu przekazania kombinacji klawiszy należy kod danego klawisza umieścić bezpośrednio przed drugim znakiem żądanej kombinacji. Przykładowo, aby jeśli chcemy przekazać do metody SendKey kombinację Ctrl+C napiszemy:
WshShell.SendKeys("^{c}");
Jeśli chcemy wysłać kombinację składającą się z większej liczby klawiszy należy posłużyć się nawiasami (). Załóżmy, że kombinacją, którą chcemy wysłać jest Shift+C+E. Aby wysłać taką kombinację należy wprowadzić ciąg +(EC), gdzie + oznacza Shift, (EC) oznacza naciśnięte równocześnie klawisze E oraz C. Jeśli przekazany do metody ciąg znaków miałby postać +EC, oznaczałoby to naciśnięcie kombinacji Shitf+E, a następnie klawisza C (+ w tym wypadku dotyczy tylko pierwszego znaku czyli E).
Dodatkowo do metody SendKey możemy przesłać liczbę odpowiadającą krotności naciśnięcia klawisza. Przykładowo ciąg {H 10} oznaczał będzie 10-krotne naciśnięcie klawisza H. Pokazuje to poniższy przykład:
var WshShell = WScript.CreateObject("WScript.Shell");
WshShell.Run("notepad.exe");
WScript.Sleep(200);
WshShell.SendKeys("{H 10}");
Automatyzacja
Środowisko podstawowe skryptów WSH jest stosunkowo ograniczone. Mimo to dzięki współpracy z technologią ActiveX skrypty posiadają praktycznie nieograniczone możliwości. Pełną "siłę" WSH można zobaczyć dopiero sterując przy pomocy skryptów zewnętrznymi aplikacjami.
Przykład - MS Word
Poniższy skrypt stanowi przykład wykorzystania programu MS Word. Wypełnia on dokument Worda opisami czcionek dostępnych w systemie.
' Uruchomienie Worda
dim w
set w = createobject("word.application")
w.visible = true
' Utworzenie nowego dokumentu
dim d
set d = w.documents.add
' Pobranie liczby dostępnych czcionek
dim iFonts
iFonts = w.fontnames.count
' Utworzenie akapitu dla każdej czcionki
dim i
for i = 1 To iFonts
d.content.insertafter w.fontnames(i) & vbcrlf
d.content.insertafter "Przykładowy tekst" & vbcrlf
d.content.insertafter "PRZYKŁADOWY TEKST" & vbcrlf
d.content.insertafter "0123456789" & vbcrlf
next
' Ustawienie czcionek dla akapitów
dim rngParagraphs
for i = 1 To iFonts * 4
if (i + 3) mod 4 = 0 then
set rngParagraphs = d.range(d.paragraphs(i+1).range.start, d.paragraphs(i + 3).range.end)
rngParagraphs.select
w.selection.font.name = w.fontnames((i - 1) \ 4 + 1)
end if
next
msgbox "Koniec"
Przykład - MS Excel
Współpraca z programem MS Excel przebiega podobnie jak w poprzednim przykładzie w MS Word:
// utworzenie obiektu reprezentującego program Excel
objXL = WScript.CreateObject("Excel.Application");
// dodanie zeszytu do arkusza
objXL.Workbooks.Add;
// ustalenie wartości komórki w pierwszej kolumnie
objXL.Cells(1,1).Value = 5;
// zaznaczenie komórek
objXL.Range(“A1:C1”).Select;
// stworzenie obiektu reprezentującego wykres
var objXLchart = objXL.Charts.Add();
Informacje o obiektach automatyzacji
Możliwości automatyzacji są specyficzne dla poszczególnych aplikacji. Głównym źródłem informacji o odstępnych metodach powinna być dokumentacja używanych programów. Źródła informacji o metodach w programach z pakietu MS Office przedstawia poniższy dokument:
Ważnym narzędziem przydatnym w odszukiwaniu odpowiednich obiektów i metod jest program firmy Microsoft o nazwie OleView (OLE/COM Object Viewer). Jest to przeglądarka obiektów COM/OLE dostępnych w systemie. OLE/COM Object Viewer dostarczany jest między innymi w pakiecie Visual Studio lub Windows 2000 Resource Kit. Można go także pobrać ze strony firmy Microsoft.
Wygląd okna OleView
Po lewej stronie znajduje się drzewo obiektów COM/OLE, po prawej zaś dokładne informacje o aktualnie wybranym obiekcie. Praktycznie do każdego zamieszczonego tam obiektu mamy dostęp przez Window Script Host. Aby taki obiekt umieścić, należy znaleźć dla niego sekwencję VersionIndependentProgID (rysunek). Sekwencja ta to nazwa, pod którą obiekt jest widoczny w Window Script Host. Znajduje się ona na zakładce Registry z prawej strony okna.
Rozważmy przykład
var WS = WScript.CreateObject(“WScript.Shell”);
WS.Popup(“Hello world”);
Spróbujmy znaleźć obiekt typu Shell, który został użyty w powyższym przykładzie. W tym celu należy rozwinąć gałąź Automation Objects i znaleźć obiekt Windows Scripting Host Shell Object. Następnie w prawej części okna programu OleView należy poszukać sekwencji VersionIndependentProgID. Interesujący nas obiekt nazywa się WScript.Shell (Rysunek).
Następnie na obiekcie Windows Scripting Host Shell Object należy wywołać menu kontekstowe i wybrać pozycję View Type Information. W ten sposób zostanie wyświetlone okno iTypeLib Viewer. Struktura tego okna (Rys. 2) jest bardzo podobna do głównego okna przeglądarki obiektów i zawiera właściwości i metody wybranego przez nas obiektu.
Aplikacja iTypeLib Viewer
W celu uzyskania bardziej przejrzystej struktury właściwości, z menu View należy wybrać polecenie Group by type kind. W celu znalezienia odpowiedniej metody (Popup) należy rozwinąć gałąź Interfaces, a następnie interface IWshShell i methods. Później zaznaczyć metodę Popup. Z prawej strony zostanie wyświetlony opis metody.
Zawarto tam następujące informacje:
pierwszy argument - tekst, który ma znaleźć się w oknie;
drugi argument - liczba sekund, po jakiej okienko zniknie z ekranu (jeżeli zostanie naciśnięty przycisk OK);
trzeci parametr odpowiada za tytuł okienka (na pasku tytułowym);
czwarty parametr określa wygląd okienka (przyciski oraz rodzaj ikony pojawiającej się po lewej stronie tekstu).
W ten sposób istnieje możliwość sprawdzenia właściwości każdego obiektu zarejestrowanego w systemie Windows. Korzystając z OleView każdy użytkownik może zbadać właściwości i metody interesującego go obiektu, aby następnie wykorzystać je w swoim skrypcie. W przypadku programów z rodziny Microsoft Office pomoc zawiera także informacje na temat udostępnianych obiektów OLE.
Zadania
Zapisz skrypt tworzący wykres funkcji sin(x) w programie Excel.
Zapisz listę drukarek zainstalowanych w systemie w dokumencie Worda.
Wydrukuj dane komputera: Nazwa, domena, użytkownik, etc. (wcześniej należy dodać jakąś drukarkę drukującą do pliku).